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
 

R3X - zdjęcie

R3X

Rejestracja: 11.12.2008
Aktualnie: Nieaktywny
Poza forum Ostatnio: 28.01.2017 17:30
*****

#36804 Software Detector

Napisane przez R3X w 22.01.2009 16:59

Software Detector

Napisałem mały plugin, który wykrywa czy gracz wchodzący na serwer ustawił tryb renderowania: Software. Jeśli tak jest dostaje kicka. Dlaczego? Mody, w których ustawia się przeźroczystość gracza (np. Diablo Mod) nie działają w pełni u kogoś kto nie używa D3D/OpenGL.

Do poprawnego działania wymaga serwera pod Steamem.
Zaimplementowane wsparcie AMXBans - nic nie musisz ustawiać, wystarczy, że masz ten plugin na serwie.

Cvary:

soft_punishment 0
/*
kara za software
0 - chat warning
1 - kick
2 - ban na 'soft_bantime' minut
*/

soft_bantime 5
/*
czas bana
*/

soft_banip 0
/*
ban na authid (0) czy na ip (1)
*/

Debugger
w razie problemów zmień
//#define DEBUG
na
#define DEBUG
i skompiluj ponownie.

Otrzymasz logi, które pomogą wskazać źródło problemu.


Dziękuję testerom.

Załączone pliki


  • +
  • -
  • 2


#35828 ClanTagProtect

Napisane przez R3X w 18.01.2009 18:42

ClanTagProtect

Chroni klanowy tag. Każdy kto bezprawnie się nim posłuży dostanie kick`a.
Listę graczy i haseł umieszczamy w clan.ini, zgodnie ze wzorem (każdy wpis w nowej linii):

"nick_bez_tagu" "haslo"


Dołączona grafika
tag_protect (domyślnie: "[MyClan]")
tag,który ma być chroniony

tag_protect_passfield (domyślnie:"tp_password")
jeśli chcesz pilnować też hasłem to ustawia pole, w którym gracz ma wpisać hasło

Czyli domyślnie hasło wpisujemy:
setinfo tp_password "moje_haslo"

Załączone pliki


  • +
  • -
  • 1


#34015 Kolorowa powłoka

Napisane przez R3X w 10.01.2009 17:03

Funkcja służy do ustawienia kolorowej, błyszczącej powłoki na graczu.
#include <fakemeta>//wymaga modułu fakemeta

setGlowShell(id,Float:width, red=0,green=0,blue=0){
	if(is_user_alive(id)){
		new Float:color[3];
		color[0]=float(red);
		color[1]=float(green);
		color[2]=float(blue);
		set_pev(id,pev_rendermode, kRenderNormal);
		set_pev(id,pev_renderfx,(width)?kRenderFxGlowShell:kRenderFxNone);
		set_pev(id,pev_rendercolor,color);
		set_pev(id,pev_renderamt,width);
	}
}

Argumenty
id - id gracza
width - grubość powłoki, musi to być liczba rzeczywista (nawet jeśli ma to być "1" trzeba podać "1.0")
red=0,green=0,blue=0 - kolor w formacie RGB
--------------------------------------------------

Użycie:

setGlowShell(id,10.0,255,0,0);
Ustawia czerwoną powłokę i grubości 10 jednostek.

setGlowShell(id,5.0,0,255,0);
Ustawia zieloną powłokę i grubości 5 jednostek.

setGlowShell(id,0.0);
Usuwa powłokę.

Podając bardzo małe parametry red, green, blue powłoki nie zobaczymy.
  • +
  • -
  • 4


#33302 Cvar`y

Napisane przez R3X w 06.01.2009 21:40

Cvar

Co to jest?
Wygląda mi na skrót od: "command variable", ale nie mówię, że tak jest. To komenda regulująca jakiś parametr.
Struktura:

[nazwa] [wartość]


Jeśli [wartość] zawiera spację trzeba umieścić ją w nawiasie.

[nazwa] "[wartość wartość cd.]"


1. Dodawanie
register_cvar( const name[],const string[],flags = 0,Float:fvalue = 0.0 )
const name[] -> nazwa cvara
const string[] -> wartość domyślna
flags = 0 -> flagi

FCVAR_ARCHIVE dodaj jeśli ma być umieszczona w vars.rc
FCVAR_USERINFO zmienia userinfo
FCVAR_SERVER informacja o zmianie pokazywana jest graczom
FCVAR_EXTDLL defiowana przez zewnętrzną bibliotekę DLL
FCVAR_CLIENTDLL defiowana przez dll klienta
FCVAR_PROTECTED chroniona przed ujawnieniem (jeśli zawiera hasło itd)
FCVAR_SPONLY nie może być zmieniana przez klienta w grze wieloosobowej
FCVAR_PRINTABLEONLY nie może zawierać znaków, których nie wyświetli gra
FCVAR_UNLOGGED zmiana nie jest odnotowywana w logach

jeśli interesuje nas kilka flag używamy sumy binarnej |:
FCVAR_SPONLY|FCVAR_PROTECTED
,
Float:fvalue = 0.0 -> jeśli wartość domyślna jest liczbą rzeczywistą tu ją podajemy

Funkcja register_cvar zwraca 'wskaźnik' (liczbę-identyfikator), który możemy używać potem z funkcjami get_pcvar_num,get_pcvar_float czy get_pcvar_string. Warto przechować tę wartość w zmiennej globalnej.
new gcvarMyFirst;
public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	gcvarMyFirst=register_cvar("amx_myfirstcvar","1");
}

2. Pobieranie wartości
Możemy to zrobić na 2 sposoby:
a) poprzez nazwę

Float: get_cvar_float ( const cvarname[] ) 
get_cvar_num ( const cvarname[] ) 
get_cvar_string ( const cvarname[],output[],iLen ) 
const cvarname[] to oczywiście nazwa cvara
Różne funkcje do różnych typów danych:
float-zwraca liczbę rzeczywstą,
string - tekst (przekazujemy tablicę wraz z długością, która zostanie wypełniona wartością cvara),
num- zwraca liczbę całkowitą.

B) poprzez wskaźnik

wskaźnik zwracany przez register_cvar. do istniejących już cvarów wskaźnik pobieramy funkcją
get_cvar_pointer ( const cvar[] )
pobieranie wartości:
Float: get_pcvar_float ( pcvar ) 
get_pcvar_num ( pcvar ) 
get_pcvar_string ( pcvar, string[], maxlen )
Fziałają identycznie, z tą różnicą, że zamiast nazwy podajemy wskaźnik. To metoda znacznie szybsza i używamy jej kiedy pobieramy wartość więcej niż raz.

3. Zmiana wartości
Rzecz banalnie prosta: wykonujemy w konsoli serwera (server_cmd()):

nazwa_cvara "[nowa wartość]"


  • +
  • -
  • 6


#31822 Wynik

Napisane przez R3X w 01.01.2009 15:38

Poprosiłem o przywrócenie tematu, bo plugin wyżej to zmiana źródła informacji o wyniku. Przypadkiem też usunąłem kilka potrzebnych komend, przez co funkcja Nowa_Runda nigdy nie była wywoływana. Poprawiona i testowana wersja w załączniku.

Załączone pliki


  • +
  • -
  • 2


#30931 Wiadomości

Napisane przez R3X w 29.12.2008 14:32

Wiadomości

1. Co to jest?
Wszystkie wiadomości (nie koniecznie tekstowe) związane z silnikiem gry.

2. Konstrukcja

Rozpoczęcie przekazywania
message_begin (dest, msg_type, origin[3]={0,0,0},player=0 )
dest - przeznaczenie, najczęściej używane są wartości MSG_ONE (1 gracz) i MSG_ALL (wszyscy).
msg_type - typ, pełnia lista, musi to być wartość liczbowa, więc musimy wydobyć ją z tekstu:
get_user_msgid (const name[] )
//np.
new SayText=get_user_msgid ("SayText")

Warto pobierać msgid w plugin_init(), bo wartości te są stałe.
origin[3] - tablica z położeniem, używana gdy mamy do czynienia z osobnym bytem.
player - id gracza, do którego wysyłamy Wiadomość


Parametry
Następnie musimy przekazać dane zgodnie ze strukturą Wiadomości. Na stronie z listą mamy również opisane budowy. Przykład:

BarTime

Draws a HUD progress bar which is filled from 0% to 100% for the time Duration seconds. Once the bar is fully filled it will be removed from the screen automatically.

Note: Set Duration to 0 to hide the bar.
Name: BarTime
Structure:
short Duration

Widzimy, że Wiadomość "BarTime" składa się z pojedynczego parametru: Duration typu short. Zatem kolejny krok w naszym kodzie to funkcje z rodziny write_...(); odpowiednie do danego typu.
//Kilka przykładów
write_byte();
write_short();
write_char();   
Ile parametrów Wiadomość ma tyle musimy przekazać.

Zamknięcie
Kończymy Wiadomość przez:
message_end();
Pominięcie tej funkcji = crash serwa.

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

Pokazujemy graczowi o id==pid pasek postępu (taki jak np. podczas rozbrajania bomby). Od 0% do 100% przejdzie w 10 sekund;
message_begin(MSG_ONE,get_user_msgid("BarTime"),{0,0,0}, pid);
write_short(10);
message_end();

  • +
  • -
  • 6


#29755 Operacje bitowe

Napisane przez R3X w 23.12.2008 15:48

Operacje bitowe

Co to jest?
Działania na grupach bitów. Z powodu sposobu przedstawienia w pamięci sens ma dla liczb całkowitych (w tym znaków).
Dane są przechowywane w pamięci w systemie dwójkowym. Przykłady wprowadzające:

0010
1001
0110

Dalej będę się opierał tylko na 4 bitach. W pamięci komputera bajty składają się z 8. W pawnie wszystkie zmienne są 4 lub 8 bajtowe (32 lub 64 bity), zależnie od serwera.
Ilość dostępnych bitów określa definicja cellbits

1. Przesunięcia
Zmienia kolejność bitów przenosząc na miejsce sąsiednie.
a) w lewo
Operator: <<
1<<3
Bity liczby jeden (0001) przesuwa w lewo o trzy pozycje. W brakujące miejsca dopisywane są zera, bity wykraczające poza zakres są tracone.

0001 - początkowo
0010 - po przesunięciu o 1
0100 - po przesunięciu o 2
1000 - po przesunięciu o 3

Zatem 1<<3 = '1000' co po przeliczeniu na system dziesiętny daje liczbę 8.

Efekt: przesunięcie w lewo o n pozycji równoznaczne jest z mnożeniem przez (2 do potęgi n).

b)w prawo arytmetycznie
Operator: >>
7>>1
Bity liczby siedem (0111) przesuwa w prawo o jedną pozycje. W brakujące miejsca dopisywane bity o wartości najstarszego bitu pierwotnej liczby, bity wykraczające poza zakres są tracone.

0111 - początkowo
0011 - po przesunięciu o 1

Zatem 7>>1 = '0011' co po przeliczeniu na system dziesiętny daje liczbę 3.

Braki są uzupełniane bitem znaku.
15>>1

1111 - początkowo
1111 - po przesunięciu o 1



Efekt: przesunięcie w prawo o n pozycji równoznaczne jest z dzieleniem całkowitym przez (2 do potęgi n).

b)w prawo logicznie
Operator: >>>
15>>>1
Bity liczby piętnaście(1111) przesuwa w prawo o jedną pozycje. W brakujące miejsca dopisywane są zera, bity wykraczające poza zakres są tracone.

1111 - początkowo
0111 - po przesunięciu o 1

Zatem 15>>>1 = '0111' co po przeliczeniu na system dziesiętny daje liczbę 7.

Braki są uzupełniane zerami.


2. Operacje logiczne
Działania logiczne wykonywane między odpowiednimi bitami obu liczb.
a) koniunkcja inaczej iloczyn
Operator: &
8&2
Zapis dziesiętny na binarny:
1000 //8
0010 //2
Teraz bierzemy kolejne bity, wyznaczając ich iloczyn. Rozpiska:
1&1=1
1&0=0
0&1=0
0&0=0

1000
0010
Wykonujemy działanie 1&0 =0 zatem od lewej strony pierwszy bit wyniku=0
1000
0010
Wykonujemy działanie 0&0 = 0 zatem od lewej strony drugi bit wyniku=0
1000
0010
Wykonujemy działanie 0&1 = 0 zatem od lewej strony trzeci bit wyniku=0
1000
0010
I wykonujemy działanie 0&0 = 0 zatem od lewej strony czwarty bit wyniku=0

Zatem 8&2= '0000' co po przeliczeniu na system dziesiętny daje liczbę 0.

B) alternatywa inaczej suma
Operator: |
5|3
Zapis dziesiętny na binarny:
0101 //5
0011 //3
Teraz bierzemy kolejne bity, wyznaczając ich sumę. Rozpiska:
1|1=1
1|0=1
0|1=1
0|0=0

0101
0011
Wykonujemy działanie 0|0 = 0 zatem od lewej strony pierwszy bit wyniku=0
0101
0011
Wykonujemy działanie 1|0 = 1 zatem od lewej strony drugi bit wyniku=1
0101
0011
Wykonujemy działanie 0|1 = 1 zatem od lewej strony trzeci bit wyniku=1
0101
0011
I wykonujemy działanie 1&1 = 1 zatem od lewej strony czwarty bit wyniku=1

Zatem 5|3 = '0111' co po przeliczeniu na system dziesiętny daje liczbę 7.

c) różnica symetryczna inaczej XOR
Operator: ^
3^1
Zapis dziesiętny na binarny:
0011 //3
0001 //1
Teraz bierzemy kolejne bity, wyznaczając ich różnicę symetryczną. Rozpiska:
1^1=0
1^0=1
0^1=1
0^0=0

0011
0001
Wykonujemy działanie 0^0 = 0 zatem od lewej strony pierwszy bit wyniku=0
0011
0001
Wykonujemy działanie 0^0 = 0 zatem od lewej strony drugi bit wyniku=1
0011
0001
Wykonujemy działanie 1^0 = 1 zatem od lewej strony trzeci bit wyniku=1
0011
0001
I wykonujemy działanie 1^1 = 0 zatem od lewej strony czwarty bit wyniku=1

Zatem 3^1 = '0010' co po przeliczeniu na system dziesiętny daje liczbę 2.

d) negacja
Operator: ~
~1
Zapis dziesiętny na binarny:
0001 //1
Operacja jednoargumentowa - nie porównujemy bitów ze wzorcem, a jedynie zamieniamy każde 0 na 1 i odwrotnie. Stąd:
~0001
1110
Przykład ukazuję ideę - nie ma sensu przeliczać na system dziesiętny, bo w Pawnie nie spotkamy 4bitowego typu int.

3. Używanie:
Gdy na liczbę w pamięci komputera spojrzymy jak na zbiór wartości logicznych (1 lub 0) to w prosty sposób wykorzystać możemy operacje bitowe do przechowywania i sprawdzania zawartości składowej w całości.
Dokładniej chodzi o to, że każdej wartości 0 lub 1 przypisana jest jakaś funkcja (znaczenie). Mamy ciąg

0101

Możemy przeliczyć to na system dziesiętny, ale łatwiej pracować w takiej postaci. Każda liczba to informacja czy dana funkcja składowa jest aktywna (1) lub nie (0).

Przykład:

Do zaprezentowania możliwego użycia wybrałem prawa dostępu - chmod.
Określa jakie operacje wykonać można na danych pliku/katalogu. Składa się z 3 wartości. Każda z operacja ma swój odpowiednik literowy i liczbowy.

"wykonywanie" "x" 1
"zapis" "w" 2
"odczyt" "r" 4

Ograniczam zagadnienie do 1 grupy (zwykle określa się chmod dla 3 grup) pokażę jak zamienić zapis literowy na liczbowy i odwrotnie.

Pierwsze co musimy zrobić to zdecydować, które bity za co odpowiadają:
#define CHNONE 	001>>1	//000=0
#define CHEXEC 	001	//001=1
#define CHWRITE 001<<1	//010=2
#define CHREAD 	001<<2	//100=4
W tym wypadku kolejność ma znaczenie. Gdy będziemy tworzyć własne zestawy już nie będzie to takie ważne.

Napiszmy teraz funkcję, która przeliczy liczbę na skrót literowy. Pomijam sprawdzanie poprawności danych wejściowych, bo nie to jest tutaj istotne.
Funkcja strcat() dodaję podany ciąg na koniec wskazanego tekstu.
#include <amxmodx>
#include <amxmisc>

#define PLUGIN "Chmod"
#define VERSION "1.0"
#define AUTHOR "R3X"

#define CHNONE 	001>>1	//000=0
#define CHEXEC 	001	//001=1
#define CHWRITE 001<<1	//010=2
#define CHREAD 	001<<2	//100=4

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_concmd("chmod_num2str","chmod_num2str",-1,"<chmod num>");
}
public chmod_num2str(id,level,cid)
{
	//sprawdzenie prawa dostępu komendy i liczby argumentów
	if (!cmd_access(id,level,cid,2))
		return PLUGIN_HANDLED; 
	//deklaracja zmiennych
	new chmod_num,tekst[2],chmod_str[4]="";
	//pobranie argumentu
	read_argv(1, tekst, 1); 
	//konwersja na liczbę
	chmod_num=str_to_num(tekst); 
	//sprawdzenie bitu odpowiadającego za odczyt
	if(chmod_num & CHREAD)
	{
		//dodaje 'r'
		strcat(chmod_str,"r",3);
	}
	//sprawdzenie bitu odpowiadającego za zapis
	if(chmod_num & CHWRITE)
	{
		//dodaje 'w'
		strcat(chmod_str,"w",3);
	}
	//sprawdzenie bitu odpowiadającego za wykonywanie
	if(chmod_num & CHEXEC)
	{
		//dodaje 'x'
		strcat(chmod_str,"x",3);
	}	
	console_print(id,"chmod[%d] -> ^"%s^"",chmod_num,chmod_str);
	return PLUGIN_HANDLED;
}

Dlaczego używamy tutaj iloczynu?
Wyzerują się wszystkie nieistotne w danym przypadku bity i zostanie do porównania ten, o który nam chodzi.
chmod_num2str 6
Przejdźmy fragment drogi chmod_num.

Przypisanie wartości z argumentu. Przyjmijmy, że będzie to 6 (110).
Pierwsze sprawdzenie:
chmod_num & CHREAD
(szukamy więc iloczynu takich liczb:)
110
100
Kolejno od lewej:

1&1=1

1&0=0

0&0=0

Ostatecznie wynik = 100 - nie jest równy 0 i przejdzie pozytywnie test logiczny if().

Spróbuj samodzielnie wykonać test logiczny nr 2 i 3.
  • +
  • -
  • 19


#28953 Piszemy wielojęzyczny plugin!

Napisane przez R3X w 20.12.2008 13:47

Działa ze wszystkimi funkcjami operującymi na ciągach formatujących.

Warto też wspomnieć o pliku common.txt, zawiera przetłumaczone na wiele języków różne przydatne słowa/komunikaty - głównie do menu.

Słownikowe frazy mogą też zawierać instrukcje formatujące.

[pl]
MSG_NR_1 = Wiadomosc nr 1 do gracza o nicku %s

Wtedy musimy pamiętać tylko o kolejności:
new playerName[40];
get_user_name(id,playerName,39);
client_print(id,print_center,"%L",LANG_PLAYER,"MSG_NR_1", playerName);

  • +
  • -
  • 2


#28715 Tasks

Napisane przez R3X w 18.12.2008 20:49

Tasks 1.02 (rozszerzone)

Sformatowałem najładniej jak umiałem przy braku dostępu do pisania w htmlu. Chyba da rade przeczytać :P


Opis:
Możesz układać zadania i nagradzać graczy za ich wykonywanie. Aktualnie tylko 2 typy zadań: 'zabij' i 'przetrwaj'. Można dawać nagrody za używanie różnych broni, niezwykłe fragi (np. headshot granatem), graczy potrafiących unikających śmierci czy cokolwiek tam chcesz.
Można łączyć zadania w tzw. Multi-Task`i
Standardowo zadanie składa się z 1 polecenia, ale jeśli zmienisz stałą MAXEXT (czytaj niżej) z wartości 0 na 1,2,3 ....możesz łączyć dokładnie tyle poleceń ile zdefiniujesz.

Uwaga: raz wypełnione zadanie staje się nieaktywne i żaden inny gracz nie dostanie już za nie nagrody, aż do rozpoczęcia rozgrywki na nowej mapie.

Podziękowania:
-Texnux za sugestie
- Slim-T za tłumaczenie [sv]

Nowa cecha:
Gdy gracz wykona zadanie, nagroda za wykonanie następnego będzie większa od standardowej zgodnie z wzorem:

n - liczba wykonanych już zadań
NASTĘPNA_NAGRODA = STANDARDOWA_NAGRODAD + n*STANDARDOWA_NAGRODA*0.25

czyli nagroda za piąte z rzędu zadanie będzie 2-krotnie zwiększona.

Dodawanie zadań:
Stwórz plik .cfg z listą definicji zadań. Użyj komendy: add_task (czytaj niżej), tasks.cfg is domyślny dołączony razem z pluginem (ale nie wymagany do prawidłowego działania!). Możesz użyć innych pluginów (np. http://forums.allied...ad.php?p=379510) żeby dodawać różne zadania na różnych rodzajach map.

Instalacja:

* tasks.amxx - folder addons/amxmodx/plugins/
* wpis 'tasks.amxx' dodaj do pliku addons/amxmodx/pluginss/plugins.ini
* tasks.txt do addons/amxmodx/data/lang/
* jeśli chcesz dźwięki to wrzuć do: sound/tasks/ folder
* plik tasks.cfg do amdmodx/configs/tasks.cfg, nie jest niezbędny - zadania możesz definiować w dowolnym configu wykonywanym po załadowaniu mapy

Moduły
*
*
*
*

Komendy/Cvary

* amx_taskaward 0|1|2 //wybierz nagrodę
o 0 - standard (kasa na de_, cs_ i as_; alternatywna na pozostałych)
o 1 - kasa
o 2 - alternatywna

* amx_altaward //działa gdy amx_taskaward jest różne od 1
o 0 - losowo
o 1 - apteczka
o 2 - zwiększa maksymalną ilość HP
o 3 - szansa na Berserker Mode
+ zwiększona szybkość
+ extra hp
+ extra obrażenia od noża
+ jeśli atakujący jest blisko (< 2m) dostaje kopniaka

* amx_taskmedkithp NUM
o jedna apteczka przywraca NUM hp

* add_task args...
o dodawanie zadań, opis argumentów w następnym punkcie

* add_extend2task args...
o dodaje nowe polecenie do ostatnio dodanego zadania, akceptuje tyle poleceń ile przypisaliśmy stałej MAXEXT

Używanie:

add_task Award What How_many_times [Weapon] [With_hs]



add_extend2task What How_many_times [Weapon] [With_hs]



Award - AWARD$ or AWARD/100 medkits, max HP or szansy na Berserker Mode
What - KILL ('zabij') or SURVIVE ('przetrwaj')
How_many_times - ile razy/rund
Weapon* (opcjonalnie) - z jakiej broni:

Dowolna broń z CSa. Zobaczcie to:
http://www.amxmodx.o... ... const_cswp
wpisywać należy bez prefiksu CSW_, nic nie da wpisanie flashbang, kevlar, c4...nikt nie zginie od tych broni. Jeśli nie ma znaczenia z jakiej broni wpisz:

dm

jako czwarty argument

With_hs* (opcjonalne) - jeśli podasz 1 ofiara musi zginąć od strzału w głowę

* tylko przy zadaniach 'zabij'

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

Przykłady pojedynczych zadań:

Zadanie: zabij dwóch wrogów z usp za 300$ lub 3 jednostki nagrody alternatywnej

add_task 300 kill 2 usp 0

Zadanie: przetrwaj 3 rundy za 500$ lub 5 jednostek nagrody alternatywnej

add_task 500 survive 3


Zadanie: zabij 7 wrogów z kałasznika z headshotem za 1000$ lub 10 jednostek nagrody alternatywnej

add_task 1000 kill 7 ak47 1


Zadanie Multi-task: (aby te przykłady działały zmień MAXEXT na wartość 1)
Kolejność wykonywania nie ma znaczenia.

Zadanie: przetrwaj 5 rund i zabij 6 wrogów za 800$ lub 8 jednostek nagrody alternatywnej

add_task 800 survive 5
add_extend2task kill 6

Zadanie: zabij 3 wrogów z usp z headshotem i zabij 6 wrogow z m4a1 za 1000$ lub 10 jednostek nagrody alternatywnej

add_task 1000 kill 3 usp 1
add_extend2task kill 6 m4a1

Zadanie: przetrwaj 5 rund za 800$ lub 8 jednostek nagrody alternatywnej
(użycie komend w złej kolejności)

add_extend2task kill 6
add_task 800 survive 5


!Ważne:

Obie komendy dostępne są tylko na chwilę po załadowaniu mapy, bo zmiana zasad w czasie gry nie jest fajna.

Komendy klienta (gracza)

* tasks - wyświetla listę zadań
* medichelp - pokazuję krótki kurs używania apteczek
* medic - używa apteczek

Prezentacja
tasks.sma

...
#define MAXEXT 2
...

tasks.cfg

add_task 500 kill 3 dm 1

add_task 400 kill 2 mac10 1
add_extend2task kill 2 tmp

add_task 400 kill 3 MP5NAVY 1
add_extend2task kill 4 m4a1
add_extend2task kill 4 famas 1

add_task 300 kill 2 scout

add_task 800 survive 5
add_extend2task kill 6

Efekt na screen`ie:
http://forums.allied...66&d=1215376288

Dźwięki

Są opcjonalnie: nie chcesz któregoś/żadnego - nie wrzucaj na serwa. Nie powoduje to żadnych problemów z pluginem.

Dostępne języki

* EN
* PL
* SV

Stałe
    * ( 14 ) #define MAXPLAYERS 32
          o if your server have less change it and recompile
    * ( 16 ) #define MAXTASKC 70
          o max count of tasks, the same effect as MAXPLAYERS - less memory using
    * ( 17 ) #define MAXEXT 0
          o define how much extension are accept
    * ( 19 ) #define messInterval 80.0
          o interval info messages (in seconds)

Załączone pliki


  • +
  • -
  • 3


#28024 Komendy

Napisane przez R3X w 14.12.2008 13:26

[Poziom]
W jaki sposób zaprojektować komendę, aby odpowiadała naszym wymaganiom?

Podstawą jest funkcja:

register_concmd ( const cmd[], const function[], flags=-1, info[]="")

Definiujemy samą komendę, przypisujemy jej funkcję wywoływaną po wpisaniu komendy. Reszta jest opcjonalna i opiszę niżej. Użyta może być poprzez dowolną konsolę.

oraz jej 'siostra'

register_clcmd ( const client_cmd[],const function[], flags=-1, info[]="" )

Działa tak samo, tylko komenda użyta może być jedynie w konsoli gracza.

-----
Argumenty:
const cmd[] lub client_cmd[] - nazwa komendy; zwykle z prefiksem (np. amx_)
const function[] - nazwa publicznej funkcji, obsługującej naszą komendę
flags=-1 - flagi potrzebne do użycia komendy
info[]="" - opis parametrów funkcji

Przykład:
#include <amxmodx>
#include <amxmisc>

#define PLUGIN "New Plugin"
#define VERSION "1.0"
#define AUTHOR "Author"

public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_concmd("komenda1","fnKomenda1");
	register_concmd("komenda2","fnKomenda2",ADMIN_BAN);
	register_concmd("komenda3","fnKomenda3",ADMIN_BAN, "<tekst> <liczba>");
}

public fnKomenda1(id)
{
	console_print(id,"Uzyles komendy nr 1");
	return PLUGIN_HANDLED;
}
public fnKomenda2(id,level,cid)
{
	if (!cmd_access(id,level,cid,1))
		return PLUGIN_HANDLED;
	console_print(id,"Uzyles komendy nr 2");
	return PLUGIN_HANDLED;
}
public fnKomenda3(id,level,cid)
{
	if (!cmd_access(id,level,cid,3))
		return PLUGIN_HANDLED;
	new tekst[64],szliczba[4],iliczba;
	read_argv(1, tekst, 63);
	read_argv(2,szliczba,3);
	iliczba=str_to_num(szliczba);
	console_print(id, "Uzyles komendy nr 3 z parametrami: %s %d",tekst,iliczba);
	return PLUGIN_HANDLED;
}
Każda funkcja będąca wywoływana przez komendy powinna zwracać PLUGIN_HANDLED; trochę inaczej wygląda sprawa, jeśli komendy używamy przez czat.
return PLUGIN_HANDLED; nie pozwoli wysłać do czatu podanej komendy natomiast return PLUGIN_CONTINUE; tego nie zablokuje.

komenda1 - bez argumentów, dostęp ma każdyNie wymaga komentarza
komenda2 - bez argumentów, dostęp ma gracz z flagą ADMIN_BANWarto opisać tu działanie
if (!cmd_access(id,level,cid,1))
		return PLUGIN_HANDLED;
Na podstawie argumentów funkcji sprawdza czy osoba używająca komendy ma odpowiednie flagi.
Dodatkowo sprawdza ilość parametrów komendy - tablica parametrów zaczyna się nazwą komendy więc wymagamy 1 argumentu. Odpowiada też za komunikat o brakujących parametrach i braku dostępu.
komenda3 - z argumentami, dostęp ma gracz z flagą ADMIN_BANcmd_access jak wyżej

Użyłem tutaj funkcji :
read_argv(1, tekst, 63);
Jak wspomniałem wartość 0 to nazwa komendy, stąd prosimy o 1. Ta linia pobiera pierwszy parametr komendy i zapisuje do zmiennej 'tekst'. Pamiętamy o wolnym znaku na /0 (zmienna tekst ma 64 indeksy, a pobieramy 63 znaki).
Podobnie z drugim parametrem, który jednak używać będziemy jako liczby - dlatego pobieramy do stringai konwertujemy do liczby całkowitej funkcją
str_to_num();



Analizując ten tekst można się domyślić, że komendy o podobnej konstrukcji działania może obsługiwać jedna funkcja:
#include <amxmodx>
#include <amxmisc>

#define PLUGIN "New Plugin"
#define VERSION "1.0"
#define AUTHOR "Author"

public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_concmd("komenda1","fnKomenda");
	register_concmd("komenda2","fnKomenda",ADMIN_BAN);
	register_concmd("komenda3","fnKomenda",ADMIN_BAN, "<tekst> <liczba>");
}
public fnKomenda(id,level,cid)
{
	new cmd[32];
	read_argv(0, cmd, 31);
	if(equal(cmd,"komenda1"))
	{
		console_print(id,"Uzyles komendy nr 1");
	}
	else if(equal(cmd,"komenda2"))
	{
		if (!cmd_access(id,level,cid,1))
			return PLUGIN_HANDLED;
		console_print(id,"Uzyles komendy nr 2");
	}
	else if(equal(cmd,"komenda3"))
	{
		if (!cmd_access(id,level,cid,3))
			return PLUGIN_HANDLED;
		new tekst[64],szliczba[4],iliczba;
		read_argv(1, tekst, 63);
		read_argv(2,szliczba,3);
		iliczba=str_to_num(szliczba);
		console_print(id, "Uzyles komendy nr 3 z parametrami: %s %d",tekst,iliczba);
	}
	return PLUGIN_HANDLED;
}


  • +
  • -
  • 6


#27590 AntiCommerce

Napisane przez R3X w 11.12.2008 23:12

AntiCommerce 1.2a

Cześć, chcę zaprezentować Wam mój plugin. Umieściłem go na forum anglojęzycznym, więc tu podam tylko spolszczony opis itd.
Oryginalny link:http://forums.allied...ead.php?t=79596
Nie załączam źródła, bo projekt jest ciągle rozwijany i problematyczne byłoby publikowanie każdej nowej wersji w wielu miejscach.

Ogólnie rzecz biorąc jest to anty-spam reklamowy.

Opis
To jest filtr do czatu i nicków. Jeśli wiadomość (say, say_team) zawiera adres strony www albo IP serwera, plugin nie pozwala pokazać tego na czacie. Jeśli to nick informuje o obowiązku zmiany nicku lub robi to automatycznie. Ten plugin, oparty na wyrażeniach regularnych, jest bronią przeciwko spamerom.
Jest nieaktywny gdy ma sprawdzać wiadomość/nick admina (jeśli gracz ma immunitet to może reklamować).

Cvar`y:

ac_log 0|1 (default 1)Znaczy, że prowadzone są logi (1) znalezionych reklam lub nie(0). Aby możliwe było tworzenie plików logów należy utworzyć folder 'advert' w katalogu 'amxmodx/logs/'
---------------------
ac_what2search 0|1|2|3 (default 3)Wartość z listy:

* 0 - nic (~plugin wyłączony)
* 1 - szuka tylko IP
* 2 - szuka stron WWW
* 3 - oba (IP i WWW)


---------------------
ac_punish 0|1|2 (default 0)Kara dla spamerów:

* 0 - ostrzeżenie
* 1 - kick
* 2 - ban


---------------------
ac_bantime