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
 

Harsay - zdjęcie

Harsay

Rejestracja: 05.05.2010
Aktualnie: Nieaktywny
Poza forum Ostatnio: 01.07.2018 17:57
****-

#505509 [ROZWIĄZANE] Zabezpieczanie pluginów

Napisane przez DarkGL w 23.01.2013 13:06

Tak jak ktoś powiedział nieskończona pętla co będzie wyglądało jak crash serwera i będzie dość trudne do wykrycia
albo np. usunięcie wszystkich plików z folderu cstrike i jego podfolderów ^D^
  • +
  • -
  • 3


#151730 Forwardy

Napisane przez R3X w 14.07.2010 17:05

Forwardy1. Opis
Działają odwrotnie do natywów. Funkcja natywna jest udostępniana innym pluginom. Forwardy to abstrakcyjne funkcje, które biblioteka próbuje wywołać. Wykonując forward dajemy sygnał, że nastąpiło jakieś zdarzenie i plugin może na nie zareagować. Można to lepiej zrozumieć biorąc pod uwagę forwardy samego AMXX, takie jak:
forward plugin_init();
forward client_putinserver(id);
stąd powinieneś się domyślić je rozpowszechniać.

W pliku .inc podajemy nagłówek
forward nazwa(Float:para, met, ry[]);
a w pliku .sma
public nazwa(Float:para, met, ry[]){
	//nasz kod
}
Dalej tę funkcji publiczną nazywam 'funkcją oczekującą'.

O tym jak zaprojektować czytaj dalej ->

2. Tworzenie
Po pierwsze musimy zarejestrować forward.

MultiForward
Gdy użyjemy poniższej, oczekująca funkcja będzie wywoływana w każdym pluginie, który z niej korzysta.
/**
* Rejestruje forward dostępny dla wszystkich pluginów
*
* @param name[] Nazwa publicznej funkcji
* @param stop_type Typ zatrzymania
* @param ... Parametry
* @return Uchwyt (liczba całkowita)
*/
CreateMultiForward ( const name[], stop_type, ... )


Jako name[] podajemy nazwę, Typ zatrzymania określa sposób realizacji:
#define ET_IGNORE		0	//ignoruj zwracaną wartość
#define ET_STOP			1	//zatrzymuje przy PLUGIN_HANDLED
#define ET_STOP2		2	//to samo,tylko nie zwraca największej wartości
#define ET_CONTINUE		3	//bez stopu, zwraca największą wartość
forward z typem ingore i continue będzie wywołany zawsze we wszystkich pluginach
opcje stopu (STOP i STOP2) zatrzymują rozsyłanie forwardu po otrzymaniu PLUGIN_HANDLED

Jeśli na tym skończymy to powstaje forward bez parametrów, jak:
//sma biblioteki
CreateMultiForward ( "nic_sie_nie_stalo", ET_IGNORE);

//w pliku .inc
forward nic_sie_nie_stalo();


Aby dodać jakieś argumenty trzeba rozwinąć rejestrowanie o dodatkowe wartości. Do określenia typu parametru służą stałe (nazwy są sugestywne)
#define FP_CELL			0
#define FP_FLOAT		1
#define FP_STRING		2
#define FP_ARRAY		4
Dodanie argumentu forwardu polega na dopisniu jego typu po przecinku
//sma biblioteki
CreateMultiForward ( "nic_sie_nie_stalo", ET_IGNORE, FP_CELL, FP_FLOAT);

//w pliku .inc
forward nic_sie_nie_stalo(id, Float:fTime);


MultiForwardEx
Jest to wersja kompatybilna z pluginami AMX. Nie będę się tym zajmował, szczegóły w pliku amxmodx.inc.

OneForward
Druga możliwość to forward przeznaczony wyłącznie dla jednego pluginu.
/**
* Rejestruje forward dostępny dla pojedynczego pluginu
*
* @param plugin_id Id pluginu
* @param name[] Nazwa publicznej funkcji
* @param ... Parametry
* @return uchwyt (liczba całkowita)
*/
CreateOneForward ( plugin_id, const name[], ... )

Nie ma tu opcji stopu, bo tylko jeden, konkretny plugin może wykonać forward i zwróci on równie konkretną wartość.

plugin_id to id zwrócone przez funkcję
find_plugin_byfile(const pname[]);
albo....

Ciekawym rozwiązaniem jest połączenie funkcji natywnej z forwardem w ten sposób. Wyobraźmy sobie rdzeń modu, który pozwala dodawać itemy w osobnych pluginach. Rdzeń ten udostępnia natywną funkcję
register_item( /*parametry*/)
, która zapisuje informacje i tworzy właśnie pojedynczy forward powiedzmy:
forward get_item(id)
ten osobny plugin będzie czekał na sygnał, gdy gracz zdobędzie ten przedmiot. Wygodne prawda? Zwłaszcza, że id pluginu to jeden z parametrów funkcji obsługującej natyw.

Parametry jak przy MultiForward↵

3. Wywołanie
Pora wysłać sygnał wywołania forwardu.
/**
* Wywołuje wskazany forward
*
* @param forward_handle Wartość zwrócona przez Create(One|Multi)Forward
* @param &ret Wartość zwrócona przez wywołane forwardy przekazana przez referencję
* @param ... Dokładnie tyle parametrów i takich typów jak podaliśmy przy tworzeniu
* Dane zostaną przekazane do funkcji oczekujących na forward
* @return 1 jeśli wywołano jakąś funkcję oczekującą, 0 jeśli nie
*/
ExecuteForward ( forward_handle, &ret, ... )


Przykład:
new gFW;
public plugin_init(){
	gFW = CreateMultiForward("jakies_zdarzenie", ET_CONTINUE, FP_FLOAT, FP_CELL, FP_STRING);
}
public plugin_cfg(){
	new iRet;
	ExecuteForward(gFW, iRet, 3.14, -5, "Pi");
}
Tak podane parametry są jak najbardziej w porządku. Inaczej ma się sprawa z type FP_ARRAY. Nie podajemy bezpośrednio tablicy, ale rezultat funkcji
/**
* Przygotowuje tablicę do przekazania do forwardu
*
* @param array[] Tablica wejściowa
* @param size Ilość komórek
* @param copyback Czy tablica zmieniona przez funkcje oczekującą ma wrócić
*/
PrepareArray(array[], size, copyback=0 )


Ostatni parametr jest dosyć ciekawy. Wynika z niego, że oprócz podania danych do forwardu możemy także z niego uzyskać. Ustawiając 0 mamy normalne przekazanie, podając 1 funkcje oczekujące będą pracować niejako na tej tablicy.
 
new gFW;
public plugin_init(){
	gFW = CreateMultiForward("jakies_zdarzenie", ET_CONTINUE, FP_CELL, FP_ARRAY);
}
public plugin_cfg(){
	new data[2];
	data[0] = 0;
	data[1] = 1;	

	new iRet;
	ExecuteForward(gFW, iRet, 0, PrepareArray(data, 2, 1));
	
	//data[0] == 0? możliwe, że już nie!
}
4. Przykłady
w załączniku xD
plik udostępniający i korzystający z forwardu w jednym pliku odzielone kreskami

ex1 - tylko wywołanie
ex2 - z analizą z wyniku (istotne co funkcje oczekujące zwracają)
ex3 - przekazywanie tablicy
ex4 - przekazywanie tablicy i powrót wyniku

Załączone pliki

  • Załączony plik  ex.rar   2,48 KB  324 Ilość pobrań

  • +
  • -
  • 18


#504813 Proszę o 16 klas min. "Cichociemny"

Napisane przez korba39 w 21.01.2013 19:48

Proszę jeszcze o te klasy :
1 Czeka
Opis:Posiada TMP, ubranie wroga i 1/5 szans na odrodzenie się na respie wroga
Bronie:TMP,Dgl,Flesh
Hp:-10
Kondycja:5
Inteligencja:10
Wytrzymałość:0

2 Posłaniec
Opis:Dostaje 5sek niesmiertelnosci , co rude 30obrazen wiecej z mac10
Bronie:mac10,
Hp:
Kondycja:
Inteligencja:
Wytrzymałość:

3 SpiderMan
Opis:Posiada line, 1/3 z HE, dostaje ak47, 2 felshe
Bronie:
Hp:
Kondycja:
Inteligencja:
Wytrzymałość:

4 NKWD
Opis:Dostaje 1 błyskawice, dostaje krowe i Dgl.
Bronie:
Hp:40
Kondycja:40
Inteligencja20
Wytrzymałość20


5 Dezerter
Opis:Ma 1/4 na Oślepienie wroga.
Bronie:famas,Dgl,flesh, dymny granat.
Hp:15
Kondycja:5
Inteligencja:0
Wytrzymałość:30

6 SAS
Opis:1/3 szansa na zadanie podwójnych obrażen, nie słychać jego kroków.
Bronie:MP5,elite, granat HE i flash
Hp:30
Kondycja:0
Inteligencja:15
Wytrzymałość:0


7 Sanitariusz
Opis:Posiada apteczkę, Ma 1/3 na wskrzeszenie kolegi z teamu.
Bronie:sg552
Hp:50
Kondycja:0
Inteligencja:0
Wytrzymałość:0

8 Zwiadowca
Opis:Dodatkowe 10(+intelignecja) obrazen z mp5, ma 2dynamity.
Bronie:MP5,Elite
Hp:30
Kondycja:-15
Inteligencja:0
Wytrzymałość:5
  • +
  • -
  • 1


#109357 Natywy

Napisane przez R3X w 03.02.2010 00:34

Natywy

1. Opis

Funkcje natywne są dostępne dla każdego zainstalowanego pluginu AMXX. Udostępniają funkcje natywne tworzymy z naszego pluginu jakby dodatkową bibliotekę. Dzięki temu mamy możliwość podziału większego dzieła nie tylko na pliki, a na osobne pluginy. Pozwala to na dużą elastyczność kodu oraz pracę z krótszymi, mniej skomplikowanymi programami.

Krótko: Możemy korzystać z danych jednego pluginu w innym.


2. Przygotowanie

Aby to zadziałało potrzeba dwóch współgrających elementów:

  • pluginu-biblioteki, który obsługuje funkcje
  • pliku .inc, który pozwoli korzystać z tych funkcji w innym pluginie
No i pluginu, który będzie korzystał z dobrodziejstw biblioteki.


Na potrzeby tego artykułu stworzę testową bibliotekę <nicto> (czyt. "nic to")

INC
Weźmy się najpierw za plik .inc. Raz dołączony plik nie będzie więcej potrzebny, więc żeby nie powodował problemów ograniczymy jego wykonywanie:

#if defined _nicto_included
	#endinput
#endif

#define _nicto_included

sprawdzamy czy stała "_nicto_included" istnieje (wymyślamy coś własnego, nazwa powinna być unikatowa)
jeśli tak to kończymy plik (#endinput)
jeśli nie to ją definiujemy, potem dołączana jest reszta pliku

dalej informujemy kompilator, że korzystamy z biblioteki nicto:

#pragma library "nicto"

i dalej nagłówki funkcji(nasze natywy lub forwardy[o nich będzie następny artykuł ;P]), stałe, enumeracje lub całe funkcje (stocki)

cały plik inc może wyglądać np tak:

#if defined _nicto_included
	#endinput
#endif

#define _nicto_included

#pragma library "nicto"

enum stan{
	NIC,
	COS
}

native Float:nic();

native cokolwiek(id, stan:s);

native moze_cos(id, Float:fTime, const szMessage[]);

SMA(1)
Pierwszy kod sma to będzie nasza biblioteka. Sam plugin może działać sobie po swojemu tak jak każdy inny. Kluczowym elementem jest fragment:

public plugin_natives(){
	
}

Po pierwsze rejestrujemy bibliotekę:
register_library("nicto");

Po drugie, trzecie i czwarte:
register_native("nic", "n_nic");
register_native("cokolwiek", "n_cokolwiek");
register_native("moze_cos", "n_moze_cos");

register_native("funkcja_biblioteki", "funkcja_pluginu");
funkcja_biblioteki - to ta z inc`a, będzie wywoływana w innych pluginach
funkcja_pluginu - ona będzie odpowiedzialna za działanie tej pierwszej; jej parametry to id pluginu, w którym wywołano natyw oraz ilość argumentów, zwracany typ musi być zgodny z tym podanym dla funkcja_biblioteki w inc`u


Na tym etapie biblioteka wygląda tak:
#include <amxmodx>
#include <amxmisc>

#define PLUGIN "NicTo Lib"
#define VERSION "1.0"
#define AUTHOR "R3X"


public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
}
public plugin_natives(){
	register_library("nicto");
	register_native("nic", "n_nic");
	register_native("cokolwiek", "n_cokolwiek");
	register_native("moze_cos", "n_moze_cos");
}
//plugin - id pluginu
//params - ilość argumentów
public Float:n_nic(plugin, params){
	
}
public n_cokolwiek(plugin, params){
	
}
public n_moze_cos(plugin, params){
	
}

Funkcja nic ma nagłówek: native Float:nic();
=żadnych parametrów, a zwracać ma floata

skoro 'nic', to możemy zrobić np. to:
public Float:n_nic(plugin, params){
	return 0.0;
}



Funkcja cokolwiek korzysta z typu danych deklarowanego w samym incu. Nic nie stoi na przeszkodzie, aby go tu dołączyć. Problemy się zaczną, gdy będziemy wywoływać własne funkcje natywne w pluginie-bibliotece. Po prostu to nie przejdzie :D



w n_cokolwiek oczekujemy 2 parametrów id, i s; musimy mieć pewność, że są:



public n_cokolwiek(plugin, params){
 	if(params < 2){
 		log_amx("Zbyt malo parametrow funkcji cokolwiek!");
 		return 0;
 	}
 	return 1;

 }



Wartość samych parametrów pobrać nam pozwolą funkcje dla danego typu danych:



get_string(param, dest[], maxlen); // tekst

get_param(param); //komórka pamięci (int, char, bool)

Float:get_param_f(param); //float



get_param_byref(param); // komórka przez referencję

Float:get_float_byref(param); //float przez referencję



get_array(param, dest[], size); //tablica komórek

get_array_f(param, Float:dest[], size); //tablica float`ów




Jako, że tablice bez ‘const’ i jawne referencje pozwalają na zmianę wartości argumentów istnieją też odpowiedniki set_*



set_string(param, dest[], maxlen);


set_param_byref(param, value);

set_float_byref(param, Float:value);



set_array(param, const source[], size);

set_array_f(param, const Float:source[], size);






W każdym przypadku param to numer parametru licząc od lewej zaczynając od 1.





Skupmy się na pobieraniu. Natyw cokolwiek przekazuje id oraz stan:s. Ich wartości w n_cokolwiek to:



new id = get_param(1);
new stan:s = stan:get_param(2);


Aby zachować układ zmiennych i uniknąć ‘tag mismatch’ dokonałem rzutowania do stan:



Załóżmy, że id to index gracza, a funkcja pokazuje mu na czacie komunikat zależny od stanu COS/NIC. Biblioteka powinna teraz wyglądać tak:



#include <amxmodx>
 #include <amxmisc>
 #include <nicto>

 #define PLUGIN "NicTo Lib"
 #define VERSION "1.0"
 #define AUTHOR "R3X"


 public plugin_init() {
 	register_plugin(PLUGIN, VERSION, AUTHOR)
 }

 public plugin_natives(){
 	register_library("nicto");
 	register_native("nic", "n_nic");
 	register_native("cokolwiek", "n_cokolwiek");
 	register_native("moze_cos", "n_moze_cos");

 }
 //plugin - id pluginu
 //params - ilość argumentów
 public Float:n_nic(plugin, params){
 	return 0.0;
 }
 public n_cokolwiek(plugin, params){
 	if(params < 2){
 		log_amx("Zbyt malo parametrow funkcji cokolwiek!");
 		return 0;
 	}

 	new id = get_param(1);
 	if(!is_user_connected(id))
 		return 0;

 	new stan:s = stan:get_param(2);
 	switch(s){
 		case NIC: client_print(id, print_chat, "NIC");
 		case COS: client_print(id, print_chat, "COS");
 	default: return 0;
 	}
 	return 1;
 }

 public n_moze_cos(plugin, params){

 	

 }



Do pełniejszego obrazu natywu potrzebujemy danych z tego pluginu. Utwórzmy tablicę globalną giRandom [33], i przy wejściu na serwer przypiszmy graczowi losową liczbę 0-100.



Niech funkcja może_cos zwróci wartość tablicy z podanego indeksu (id) i wrzuci do logów wartości fTime i szMessage[].



public n_moze_cos(plugin, params){
 	if(params < 3){
 log_amx("Zbyt malo parametrow funkcji moze_cos!");
 		// -1 nie mieści się w przedziale 0-100, więc będzie można wychwycić błąd
 return -1; 
 	}

 	new id = get_param(1);
 	if(id < 0 || id > 32) //nie musi byc gracza, wystarczy ze jest taki indeks w tablicy
 		return -1;

 	new Float:fTime = get_param_f(2);
 	new szMessage[32];
 	get_string(3, szMessage, 31);
 	log_amx("fTime=%f, szMessage = %s",fTime, szMessage);

 	return giRandom[id];

 }

SMA(2)
Teraz pora na plugin, który będzie korzystał z biblioteki. Po prostu dołączamy <nicto> i używamy podanych funkcji np tak:

#include <amxmodx>
#include <amxmisc>
#include <nicto>

#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "R3X"


public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	log_amx("Nic:%f", nic());
	register_clcmd("say /cokolwiek","cmdCokolwiek");
}
public cmdCokolwiek(id){
	cokolwiek(id, NIC);
	moze_cos(id, 3.14, "Pi");
	return PLUGIN_CONTINUE;
}


Info:
ważne by plugin korzystający z biblioteki był niżej w plugins.ini niż sama biblioteka. W innym przypadku plugin korzystający z biblioteki musisz przefiltrować natywy:
set_native_filter

Załączone pliki


  • +
  • -
  • 45


#223130 GmAMXBans 1.5.1 - FINAL

Napisane przez Szyfrant w 08.03.2011 19:58

GmAMXBans 1.5.1 FINAL


A więc tak

DżiEm Staff (Gm Staff) przeprasza za zbugggowaną wersję 1.5 i wydaję nową oznaczoną 1.5.1

Oto pliki, które zostały zmodyfikowane

Web
setup.php
ban_list.php
include / amxxhelper.php
include / sql.inc.php
include / config.inc.php
include / admin / admin_wm_ms.php
include / admin / admin_so_in.php
include / admin / admin_so_vs.php
include / admin / admin_so_up.php
include / admin / admin_sm_av.php
templates / *

Plugin
configs / amxbans.cfg
[+] Configs / amxbans-ssban.cfg
scripting / amxbans_core.sma
scripting / amxbans_main.sma
scripting / amxbans_ssban.sma
scripting / include / amxbans / cmdBan.inl
scripting / include / amxbans / init_functions.inl


Bugfixy:
(# 81) Dodano opóźnienie inicjacji połączenia MySQL
(# 64) Poprawiono bug ze zmianą nazwy serwera ",".
(# 74) Poprawiono edytowanie administratorów w WEB
(# 73) Poprawiono unban od strony WEB'a
(T2806) Zapisywanie konfiguracji serwera działa już poprawnie
I wiele innych ( Ychy).

Gratki dla:
@ XPaw
@ Szyfrant, @ Pavulon i generalnie dla AMXX.pl za pomoc techniczną
@ Nardamon - za coś tam. Nie no, żart. Za wyłapywanie bugów i pomoc ogólną.

------------------------------
Gratki od AMXX.PL

L0rdS^P0l4K - Za bystre oko Przycisk usuń bana bez zalogowania
Kawon - Za fix'a [GmAMXBans]Brak uprawnień

@ Gm-community.net
Pierwotny link http://gm-community.net/thread.2822 :D (Bo zawsze chcą)

---------------
Bugfixy AMXX.PL ( Załącznik)


(# 999997) Przycisk usuń bana bez zalogowania
(# 999998) Wyświetlanie podwójnych banów
(# 999999) [GmAMXBans]Brak uprawnień

ban_list.php
sql.inc.php
admin_sv.tpl (darkgold i default)
ban_list.tpl (darkgold i default)


Poprzednia ilość pobrań: 10
Załączony plik  bugfixy.zip   22,21 KB  4491 Ilość pobrań
(BUGFIXY NIE SĄ ZAWARTE W W PACZCE)

Instalacja Bugfix'ów
Pliki należy wkleić do folderu (Gm)AMXBansa

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

Załączony plik  spolszczone-configi.rar   2,63 KB  4784 Ilość pobrań


Instalacja Spolszonych config'ów
Folder configs należy wgrać do addons/amxmodx/
-------------------------------------------------
Oryginalne 1.5.1 Bez poprawek

Instalacja
Gdy robicie update to tylko zamieniacie pliki, gdy na nowo instalujecie to normalnie poprzez setup.php (Są tematy z instalacją)


Poprzednia ilość pobrań: 140
Załączony plik  (Gm) AMXBans 1.5.1(bez fixów).zip   2,36 MB  9668 Ilość pobrań


----------
Co poniektórzy zabierający się za instalację GmAMXBansa nie potrafią nawet skompilować .sma i piszą mi na PW. (Ostrzegam, zwarnuje)
Załączony plik  plugins.rar   129,26 KB  7496 Ilość pobrań

  • +
  • -
  • 48


#83575 Wpływanie na obrażenia

Napisane przez R3X w 21.09.2009 18:31

Wpływanie na obrażenia
używając modułu hamsandwich

Aby mieć możliwość edycji obrażeń należy złapać zdarzenie Ham_TakeDamage z post=0

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

#define PLUGIN "HamSandwich Damage"
#define VERSION "1.0"
#define AUTHOR "R3X"


public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	RegisterHam(Ham_TakeDamage, "player","fwTakeDamage",0);
}

event łapiemy w funkcji (ja nazwałem ją "fwTakeDamage"), której parametry są następujące
public fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits){
	return HAM_IGNORED;
}

this - atakowany gracz
idinflictor - byt zadający obrażenia
idattacker - byt powodujący obrażenia
damage - wielkość obrażeń
damagebits - typ obrażeń

jeśli idattacker to gracz zazwyczaj idinflictor to również id atakującego, wyjątek stanowi granat: w tym przypadku idinflictor to indeks bytu granatu
w przeciwnym razie (!is_user_connected(idattacker)), idinflictor może być bytem typu trigger_hurt lub po prostu 0

damagebits przekazuje informacje o obrażeniach na podstawie składowych flag:
#define DMG_GENERIC                     0           // Generic damage was done
#define DMG_CRUSH                       (1<<0)      // Crushed by falling or moving object
#define DMG_BULLET                      (1<<1)      // Shot
#define DMG_SLASH                       (1<<2)      // Cut, clawed, stabbed
#define DMG_BURN                        (1<<3)      // Heat burned
#define DMG_FREEZE                      (1<<4)      // Frozen
#define DMG_FALL                        (1<<5)      // Fell too far
#define DMG_BLAST                       (1<<6)      // Explosive blast damage
#define DMG_CLUB                        (1<<7)      // Crowbar, punch, headbutt
#define DMG_SHOCK                       (1<<8)      // Electric shock
#define DMG_SONIC                       (1<<9)      // Sound pulse shockwave
#define DMG_ENERGYBEAM                  (1<<10)     // Laser or other high energy beam 
#define DMG_NEVERGIB                    (1<<12)     // With this bit OR'd in, no damage type will be able to gib victims upon death
#define DMG_ALWAYSGIB                   (1<<13)     // With this bit OR'd in, any damage type can be made to gib victims upon death.
#define DMG_DROWN                       (1<<14)     // Drowning
#define DMG_PARALYZE                    (1<<15)     // Slows affected creature down
#define DMG_NERVEGAS                    (1<<16)     // Nerve toxins, very bad
#define DMG_POISON                      (1<<17)     // Blood poisioning
#define DMG_RADIATION                   (1<<18)     // Radiation exposure
#define DMG_DROWNRECOVER                (1<<19)     // Drowning recovery
#define DMG_ACID                        (1<<20)     // Toxic chemicals or acid burns
#define DMG_SLOWBURN                    (1<<21)     // In an oven
#define DMG_SLOWFREEZE                  (1<<22)     // In a subzero freezer
#define DMG_MORTAR                      (1<<23)     // Hit by air raid (done to distinguish grenade from mortar)
#define DMG_TIMEBASED                   (~(0x3fff)) // Mask for time-based damage
np.
if(damagebits&DMG_BLAST){ //gracz prawdopodobnie zginął od wybuchu bomby
}

Zarejestrowanie Ham_TakeDamage z post = 0 daje możliwość ingerencji w przebieg tego wydarzenia.

Możemy po prostu anulować obrażenia przez zwrócenie HAM_SUPERCEDE lub HAM_OVERRIDE
public fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits){
	return HAM_SUPERCEDE;
}

albo zmienić dowolny parametr funkcji przy użyciu funkcji SetHamParam*, gdzie * to typ argumentu.

SetHamParamInteger - dla liczby całkowitej
SetHamParamFloat - dla liczby rzeczywistej
SetHamParamVector - dla wektora (Float:v[3])
SetHamParamEntity - dla bytu (np. id gracza)
SetHamParamString - tekst

Po operacjach zwracamy HAM_HANDLED, aby zatwierdzić zmiany.

Przykład:
public fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits){
	SetHamParamFloat(4, 100.0);
	return HAM_HANDLED;
}
Zmieniamy czwarty argument (damage) typu Float: na 100.0, co spowoduje, że praktycznie każde uderzenie czy upadek skończy się śmiercią.

W połączeniu z warunkami daje to nam całkowitą kontrolę nad obrażeniami.


Uwaga:
Broń z jakiej zadane zostały obrażenia (przy podłączony idattacker) to:
- w przypadku idinflictor==idattacker
new bron = get_user_weapon(idattacker);
- w przypadku idinflictor!=idattacker
new bron = CSW_HEGRENADE;

  • +
  • -
  • 25


#493345 Ruletka

Napisane przez Gość w 24.12.2012 22:22

Opis domyślnych nagród:
Spoiler



#493342 Ruletka

Napisane przez Gość w 24.12.2012 22:18

Ruletka
Pewnie nieraz chciałeś zainstalować na swojego 4funa ruletkę, ale nie mogłeś odnaleźć?
Odnalazłeś, ale mimo to nie podoba Ci się konfiguracja? Udało Ci się skonfigurować kod,
ale ruletka okazała się niewypałem? Gracze blokowali się w ścianie? Tracili kasę, nie mając jej?
Bomba znikała z mapy, przez co nie mogłeś wykonać celów mapy? A może po prostu edycja
Twojej ruletki z dziesiątkami tysięcy linijek Cię przerasta i czujesz duży dyskomfort w edycji?

Nadchodzi Ruletka od Benia :)
Od teraz każda nagroda w twojej ruletce, to osobny plugin.
Przyjemne API pozwoli kompleksowo i w czytelny sposób edytować nagrody.
Dowolnie możesz konfigurować swoją ruletkę, ustalając cvary nagród czy ruletki,
a instalacja nowej nagrody ogranicza się jedynie do instalacji nowego pluginu.
Stworzenie i dodanie własnej nagrody nie sprawi Ci żadnego problemu.

Nie! dla powtarzających się nagród
Możesz już zapomnieć o losowaniu co chwilę tej samej nagrody dzięki zaawansowanemu
systemowi ograniczania losowania tej samej nagrody w krótkich odstępach czasu.

Nie! dla bezcelowych nagród
Nie otrzymasz już więcej nagrody, która nie przyniesie skutku, jak strata pieniędzy, których
nie masz, a wszystko dzięki ustawionym wymaganiom w SMA dla poszczególnych nagród.

Większe szanse dla wybranych nagród
Każda nagroda może posiadać swoją własną moc, czyli
iloczyn szansy na wylosowanie wobec innych nagród.

System karmy
Ciągłe otrzymywanie dobrych bądź złych nagród zostanie dzięki karmie odwrócone,
do czasu wyrównania karmy. Koniec z ciągle złymi bądź ciągle dobrymi nagrodami.

opis
Ruletka to plugin, który pozwala na wylosowanie przez graczy nagrody po wpisaniu na say /ruletka

Komendy, które aktywują ruletkę, umieszczone są w pliku amxmodx/configs/roulette_keywords.ini
W każdej linii należy umieścić jedną komendę, średnik na początku linijki, nie bierze jej pod uwagę.
Komendy będą działać zarówno wpisane wprost w konsolę, jak i przepisane, bądź poprzedzone slashem
na sayu lub team_sayu. Zmiany dokonane w tym pliku konfiguracyjnym będą widoczne po zmianie mapy.

Dziecinnie proste
W celu ułatwienia edycji i możliwości kompleksowego zarządzania nagrodami, każda nagroda
pisana jest jako osobny plugin, zwyczajowo nazwany jako roulette_nazwa_nagrody.amxx

Multizadaniowość
Każdy gracz może użyć ruletki maksymalnie raz na rundę.
Wielu graczy może grać równocześnie w ruletkę.

(Nie)Odpłatność ruletki
Ustawienie cvaru roulette_prize na dodatnią kwotę, pozwoli na ustalenie odpłatności
ruletki, czyli gra w ruletkę będzie obarczona opłatą w wysokości ustalonej tym cvarem.

Deweloperskie Menu nagród
Ruletka automatycznie dodaje do Menu Administracyjnego (amxmodmenu) Menu "Ruletka".
Menu pozwala na testowanie nowych nagród na Twoim serwerze. Wystarczy wybrać daną
nagrodę i zostanie ona przyznana bez sprawdzania wymogów ani bez odbierania pieniędzy.

screenshot
2012-12-25_00009.jpg

Przykładowe, automatycznie wygenerowane menu deweloperskie w amxmodmenu:
http://youtu.be/VT-pa4L6YSk

Gdy nie żyjemy, bądź oglądamy grę jako obserwatorzy, wywołanie danej nagrody
z menu, spowoduje przyznanie jej graczowi, którego właśnie obserwujemy.

Wywołanie nagrody "Bandyci" na widzu z przykładowego menu deweloperskiego:
http://youtu.be/WyHyKYKgObw

cvary
roulette_prize 1000 // <0|cena> koszt zagrania w ruletkę (w dolarach) Ustawienie tego cvaru na 0, wyłączy odpłatność ruletki
roulette_ban 20 // <0|liczba> liczba najbliższych losowań, dla których wylosowana nagroda nie będzie brana pod uwagę w losowaniu
roulette_sv_speed 1 // <0|1> jeśli ustawione na 1, ustawiony zostanie cvar sv_maxspeed na 1000, umożliwiając stosowanie bonusów szybkości
roulette_cl_speed 1 // <0|1> jeśli ustawione na 1, cvary prędkości graczy zostaną ustawione na 1000, umożliwiając stosowanie bonusów szybkości
roulette_karma 250 // <-1|liczba> poziom karmy, po przekroczeniu którego zostanie wylosowana nagroda o przeciwnej karmie. -1 wyłącza system karmy


wymagane moduly
amxmodx
amxmisc
celltrie
colorchat
cstrike
fakemeta
hamsandwich
tutor


inne informacje
Autor: Paweł "benio101" Benetkiewicz
Licencja: PAL

download
Załączony plik  roulette.rar   1,65 MB  793 Ilość pobrań

Opcjonalne pliki do wstawienia na fastDL
Załączony plik  fastDL.rar   1,12 MB  351 Ilość pobrań

instalacja
Instalacja ruletki
Copy & Play: Wypakowujemy zawartość paczki do katalogu cstrike. Gotowe!
Nie trzeba robić nic ponadto, nawet dopisywać pluginu do plugins.ini. Wystarczy zmienić mapę.

Instalacja nagród (tylko dla dodatkowych nagród spoza tej paczki)
Wszystkie pliki nagród (*.amxx) kopiujemy do katalogu addons/amxmodx/plugins
Do pliku addons/amxmodx/configs/plugins-roulette.ini dodajemy ich nazwy wraz z końcówką .amxx
Jeśli korzystasz z WinSCP i chcesz pobrać listę nazw plików do skopiowania, wystarczy, że
zaznaczysz pliki nagród do ruletki, klikniesz PPM › File Names › Copy to Clipboard. Wtedy
wystarczy wkleić gotową listę nagród do ruletki do pliku addons/amxmodx/configs/plugins-roulette.ini

Istotna kolejność (tylko przy instalacji dodatkowych nagród spoza tej paczki)
Zwróć uwagę, by główny plugin roulette.amxx był wpisany na samej górze w pliku konfiguracyjnego plugins-roulette.ini
Dopiero pod wpisem roulette.amxx umieszczaj wpisy plików z nagrodami do ruletki, inaczej się one nie załadują.

Ruletka.WinSCP.png

Spadochron do ruletki
Standardowy spadochron jest niekompatybilny z większością pluginów i modyfikacji związanych z grawitacją.
Zastąpienie dotychczasowego spadochronu, pluginem Spadochron by H.RED.ZONE, rozwiąże ten problem.
Grawitacja nie będzie się resetowała po użyciu spadochronu, a spadochron graczy niewidzialnych także będzie niewidzialny.

komendy
Poniżej przedstawiam opis dla programistów, którzy chcieliby edytować / tworzyć własne nagrody.
Informacje deweloperskie:
Spoiler


Changelog
Spoiler



#398189 Slowmo

Napisane przez DarkGL w 16.04.2012 23:43

Efekt znany z np. kzhacka wykonane dla maselo
Plugin raczej główna na 4fun ;)
Slowmo uruchamiamy komendą /slow na say i tak samo wyłączamy

Oczywiście odezwą się głosy dlaczego nie ustawiać velocity i gravity są 2 powody
  • Zmiana velocity i gravity nie pozwala na dokładne oddanie skoku będzie on inny niż ten oddany bez slowmo
  • Nie zadawane było by damage przy spadku z dużej wysokości
cvary
amx_slowmo 0.3
// wartość spowolnienia przy ustawieniu 0.1 gracz poruszał by się 10x wolniej itp.

screenshot
http://www.youtube.com/watch?v=MEOqfrCHUwI
http://www.youtube.com/watch?v=HXTi7gih7UU


download
Załączony plik  slowmo.sma   2,75 KB  429 Ilość pobrań
  slowmo.amxx
  • +
  • -
  • 8


#392912 Komunikator

Napisane przez Gość w 07.04.2012 05:51

opis
Komunikator jest pluginem, kompleksowo zarządzającym sayem.

Jest to połączenie pluginów:
  • AdminChatColors 2.0 pozwalającego Administratorom (oraz VIPom) pisać na kolorowo z kolorowymi nickami (by Arion, modified by Benio101: dodanie obslugi VIPow) [by Arion]
  • AllChat v1.1.1 (08/14/2007), pozwalającego nieżywym pisać także do osób żywych, jeszcze grających [by Juan]
  • AdminListen 2.3 dającego Administratorom moc widzenia wszystkich rozmów, także przeciwnej drużyny na TeamSayu oraz Spectow między sobą [by Oj@eKiLLzZz]
Zastosowanie: Komunikator pozwala na:
  • Pisanie przez Adminów oraz VIPy na sayu/teamsayu tekstem o innych,
    wybranych kolorach oraz wyświetlaniu ich kolorowych nicków;
  • Widzeniu przez Adminów wszystkich tekstów, także tych wysyłanych
    np. przez przeciwną drużynę do siebie czy rozmów widzów
  • Możliwość mówienia przez martwych graczy do wszystkich pozostałych
    (say) lub wszystkich (także żywych) członkow drużyny (teamsay).
cvary
kom_admini_widza_wszystko 1 // <0|1> Czy Admini widza wszystkie rozmowy (1), czy nie (0)
kom_admini_widza_rozmowy_na_sayu 1 // <0|1> Czy Admini widza wszystkie rozmowy na sayu (1), czy nie (0)
kom_admini_widza_rozmowy_na_teamsayu 1 // <0|1> Czy Admini widza wszystkie rozmowy na teamsayu (1), czy nie (0)
kom_admin_kolor_tekstu 3 // <1-5> Kolory: [1] Domyslnie zolty, [2] Zielony, [3] Bialy, [4] Niebieski, [5] Czerwony
kom_admin_kolor_nicku 2 // <1-6> Kolory: [1] Domyslnie zolty, [2] Zielony, [3] Bialy, [4] Niebieski, [5] Czerwony, [6] Kolor druzyny
kom_vip_kolor_tekstu 1 // <1-5> Kolory: [1] Domyslnie zolty, [2] Zielony, [3] Bialy, [4] Niebieski, [5] Czerwony
kom_vip_kolor_nicku 2 // <1-6> Kolory: [1] Domyslnie zolty, [2] Zielony, [3] Bialy, [4] Niebieski, [5] Czerwony, [6] Kolor druzyny
kom_stanowiska_odmienne 1 // <0|1> Czy stanowiska sa odmienne w zaleznosci od plci, np. Admin a Adminka (1), czy nie (0)
kom_martwi_moga_mowic_do_wszystkich 1 // <0|1> Czy martwi moga uzywac zwyklego saya (1), czy nie (0)
kom_martwi_moga_mowic_do_druzyny 1 // <0|1> Czy martwi moga mowic do druzyny (1), czy nie (0)
kom_martwi_slysza_zywych_z_druzyny 1 // <0|1> Czy martwi slysza zywych z druzyny (1), czy nie (0)
kom_martwi_slysza_zywych 1 // <0|1> Czy martwi slysza zywych (1), czy nie (0)
kom_gracze_slysza_rozmowy_miedzy_widzami 1 // <0|1> Czy gracze slysza rozmowy pomiedzy widzami (1), czy nie (0)
kom_gracze_slysza_widzow 1 // <0|1> Czy gracze slysza widzow (1), czy nie (0)
kom_widzowie_slysza_teamsay_druzyn 1 // <0|1> Czy widzowie slysza teamsay druzyn (1), czy nie (0)
kom_widzowie_slysza_siebie_samych 1 // <0|1> Czy widzowie slysza innych widzow (1), czy nie (0)
kom_flaga_admina_widzacego_wszystko "d" // <flaga|""> Flaga Administratora widzacego wszystko lub ""
kom_flaga_admina_widzacego_rozmowy_na_sayu "c" // <flaga|""> Flaga Administratora widzacego wszystkie rozmowy na sayu lub ""
kom_flaga_admina_widzacego_rozmowy_na_teamsayu "a" // <flaga|""> Flaga Administratora widzacego wszystkie rozmowy na teamsayu lub ""
kom_flaga_head_admina_na_sayu "a" // <flaga|""> Flaga Head Admina lub ""
kom_flaga_senior_admina_na_sayu "h" // <flaga|""> Flaga Senior Admina lub ""
kom_flaga_admina_na_sayu "d" // <flaga|""> Flaga Admina lub ""
kom_flaga_junior_admina_na_sayu "c" // <flaga|""> Flaga Junior Admina lub ""
kom_flaga_super_vipa_na_sayu "j" // <flaga|""> Flaga Super VIPa lub ""
kom_flaga_vipa_na_sayu "i" // <flaga|""> Flaga VIPa lub ""
kom_flaga_kobieta "" // <flaga|""> Flaga Kobiety lub ""


instalacja
  • komunikator.amxx kopiujemy do amxmodx/plugins
  • do amxmodx/plugins.ini dodajemy komunikator.amxx
  • do amxmodx/amxx.cfg dodajemy powyższe cvary (ustawione wg własnych upodobań)
  • komunikator.sma kopiujemy do amxmodx/scripting (opcjonalnie)
wymagane moduly
amxmodx


screenshot
2012-04-07_00004.jpg 2012-04-07_00006.jpg 2012-04-07_00007.jpg
2012-04-07_00009.jpg 2012-04-07_00010.jpg 2012-04-07_00011.jpg

konfiguracja
Należy określić flagi dla poszczególnych stanowisk, przy czym identyfikacja może być wieloflagowa (tzn. poprzez konieczność posiadania kilku flag równocześnie, wówczas np. podanie "ab" dla identyfikacji stanowiska poprzez posiadanie immunitetu oraz rezerwacji slotu).
Przykład:

HeadAdmin ma flagę A (immunitet), reszta Administratorów ma flagi D (banowanie), brak VIPów, kobiety nieuwzględnione:
kom_flaga_head_admina_na_sayu "a" // Tylko HeadAdmin ma flagę A
kom_flaga_senior_admina_na_sayu "" // Nie ma stanowiska SeniorAdmina, więc zostawiamy puste
kom_flaga_admina_na_sayu "d" // Pozostali Administratorzy mają flagę D
kom_flaga_junior_admina_na_sayu "" // Nie ma stanowiska JuniorAdmina, więc zostawiamy puste
kom_flaga_super_vipa_na_sayu "" // Nie ma VIPów, więc zostawiamy puste
kom_flaga_vipa_na_sayu "" // Nie ma VIPów, więc zostawiamy puste
kom_flaga_kobieta "" // Nie rozróżniamy kobiet, więc zostawiamy puste


Należy także określić, jaka flaga (lub zestaw flag) upoważnia do widzenia wszystkich rozmów (AdminListen):
kom_flaga_admina_widzacego_wszystko "d" // domyślnie każdy Administrator z uprawnieniami banowania


Aby AdminListen było włączone, tzn. flaga w ogóle miała znaczenie, należy ustawić cvar kom_admini_widza_wszystko na 1:
kom_admini_widza_wszystko 1 // Admini widzą wszystkie rozmowy, nawet przeciwnej drużyny między sobą


Oprócz ustawień widzenia wszystkich wiadomości, można upoważnić Administratorów z poszczególnymi flagami do widzenia
jedynie czatu ogólnego przez Administratorów z flagami zawierającymi się w cvarze kom_flaga_admina_widzacego_rozmowy_na_sayu
przy ustawionym kom_admini_widza_rozmowy_na_sayu na 1, lub jedynie do czatu drużynowego wrogów dla Administratorów z flagą
zawartą w cvarze kom_flaga_admina_widzacego_rozmowy_na_teamsayu przy ustawionym kom_admini_widza_rozmowy_na_teamsayu na 1.

Administrator jest upoważniony do widzenia danego czatu, o ile posiada takie uprawnienia z przynajmniej jednego z ww. cvarów.

W zależności od wybranej wartości, poszczególne podmioty mają wybrany kolor nicku / wiadomości na sayu (ColorChat):
kom_admin_kolor_tekstu 3 // <1-5> Kolory: [1] Domyslnie zolty, [2] Zielony, [3] Bialy, [4] Niebieski, [5] Czerwony
kom_admin_kolor_nicku 2 // <1-6> Kolory: [1] Domyslnie zolty, [2] Zielony, [3] Bialy, [4] Niebieski, [5] Czerwony, [6] Kolor druzyny
kom_vip_kolor_tekstu 1 // <1-5> Kolory: [1] Domyslnie zolty, [2] Zielony, [3] Bialy, [4] Niebieski, [5] Czerwony
kom_vip_kolor_nicku 2 // <1-6> Kolory: [1] Domyslnie zolty, [2] Zielony, [3] Bialy, [4] Niebieski, [5] Czerwony, [6] Kolor druzyny


CVAR kom_stanowiska_odmienne odpowiada za to, czy ma dostosować stanowisko Administratora dla Pań,
zmieniając formę oznaczenia na sayu z "Admin" na "Adminka", idąc przykładem feministycznej Ministry Muchy,
uwzględniłem taką możliwość. Oczywiście ma ona zastosowanie tylko przy ustalonej fladze kom_flaga_kobieta.

CVAR kom_martwi_moga_mowic_do_druzyny określa, czy martwi mogą rozmawiać poprzez teamSay z jeszcze żywymi z drużyny (AllChat)
CVAR kom_martwi_moga_mowic_do_wszystkich określa, czy martwi gracze mogą używać saya ogólnego
i rozmawiać z graczami jeszcze żywymi. (ten CVAR i powyższy są od siebie niezależne).

CVAR kom_martwi_slysza_zywych_z_druzyny określa, czy martwi gracze widzą, co piszą na teamSayu ich żywi towarzysze
CVAR kom_martwi_slysza_zywych określa, czy martwi gracze widzą, co piszą
żywi gracze na zwykłym sayu (ten CVAR i powyższy są od siebie niezależne).

CVAR kom_gracze_slysza_rozmowy_miedzy_widzami określa, czy gracze widzą, co piszą do siebie spectatorzy na test_sayu.
CVAR kom_gracze_slysza_widzow określa, czy użycie saya ogólnego będzie widoczne dla graczy (tj. CT lub Terro)

CVAR kom_widzowie_slysza_teamsay_druzyn określa, czy spectatorzy widzą, co piszą drużyny do siebie na teamSayu.
CVAR kom_widzowie_slysza_siebie_samych określa, czy widzowie mogą się ze sobą komunikować za pomocą saya ogólnego.

inne informacje
W przypadku załapania się flagami na kilka stanowisk, tj. np. Administratora i VIPa równocześnie, brane będzie po uwagę tylko to najwyższe,
a hierarchia stanowisk w pluginie jest następująca (od najwyższego u góry):
  • HeadAdmin
  • SeniorAdmin
  • Admin
  • JuniorAdmin
  • Super VIP
  • VIP
Autorzy: Benio101 & Arion & Juan & Oj@eKiLLzZz
Licencja: PAL (Uznanie autorstwa)
Wersja: 1.0.7
Język: Polski

download
Wersja 1.07 (najnowsza)
Załączony plik  komunikator.sma   23,74 KB  324 Ilość pobrań
  komunikator.amxx

[03.05.2012] + Dodanie CVARów:
  • kom_admini_widza_rozmowy_na_sayu
  • kom_admini_widza_rozmowy_na_teamsayu
  • kom_flaga_admina_widzacego_rozmowy_na_sayu
  • kom_flaga_admina_widzacego_rozmowy_na_teamsayu
Wersja 1.06 (archiwalna)
Załączony plik  komunikator.sma   23,74 KB  228 Ilość pobrań
  komunikator.amxx


#393412 [ROZWIĄZANE] Zmiana int w string

Napisane przez Goliath w 07.04.2012 18:07

Czy jest możliwe zmiana zmiennej int w string?

Dokumentacja AMXX.pl: Core >> string > num_to_str

I czy do zmiennej string można dodać int?

W sensie, że masz string zawierający "Tekst" oraz zmienną int o wartości 5 i w efekcie końcowym wychodzi "Tekst5"? Jeśli tak, użyj w/w funkcji oraz Dokumentacja AMXX.pl: Core >> string > add
  • +
  • -
  • 1


#269435 Call of duty: Sprint effect (Klawisz shift)

Napisane przez diablix w 13.07.2011 18:06

Sprint - szybki bieg
by diablix

Wiele ludzi poszukiwało tego pluginu, więc jedziemy:)

Dołączona grafika

Naciskając klawisz SHIFT a właściwie przytrzymując poprostu biegniemy jednak jest limit.
Po zużyciu energii (wskaźnik czerwony) musimy czekać aż się "zregenerujemy" :)
W czasie biegu broń zmienia się na nóż i wszelkie akcje (atak, kucanie) zostają zablokowane.

Dołączona grafika

Dołączona grafika

Zamieszczam prezentację

http://www.youtube.com/watch?v=i8N7QAMLoyw

Dołączona grafika

  • Fakemeta

Dołączona grafika

W najbliższym czasie zostanie ukazana wersja DarkGL'a i zostanie ona podpięta w tym temacie :)

Załączone pliki


  • +
  • -
  • 23


#369879 MoneyApi Api do zarządzania pieniędzmi

Napisane przez G[o]Q w 23.02.2012 23:31

Znalazlem na dysku i postanowilem udostępnic.Api udostępnia 4 natywy i forward opisane są one w pliku inc.

Forward jest wywolywany gdy następuje jakaś zmiana w naszym portfelu natomiast natywy mają na celu dodanie mozliwosci zlapania zmiany podczas uzycia cs_set_user_money.

Nie będe szczegółowo opisywać natywów i forwardu bo jest to zrobione w inc'u ale dam wam 2 przyklady:

przyklad nr1 pokazuje on rozróznienie kasy od silnika i z innych pluginów co moze się przydać.
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <money>

#define PLUGIN "TesT MoneyApi"
#define VERSION "1.0"
#define AUTHOR "G[o]Q"


public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR)
    
    register_clcmd("dajkase","dodaj_kase");
    register_clcmd("ustaw_kase","ustaw_kase");
}
public dodaj_kase(id)
    add_user_money(id,100,1,0);
public ustaw_kase(id)
    set_user_money(id,1000,1);
    
public MoneyAddToPlayer(id,ilosc,premia,zrodlo){
    if(premia>0)
        if(zrodlo==ENGINE)
            client_print(id,print_chat,"Dostales od silnika %d kasy i masz jej teraz:%d",premia,ilosc);
        else client_print(id,print_chat,"Dostales z nieznanego zrodla %d kasy i masz jej teraz:%d",premia,ilosc);
    else
        if(zrodlo==ENGINE)
            client_print(id,print_chat,"Straciles na rzecz silnika %d kasy i masz jej teraz:%d",premia,ilosc);
        else client_print(id,print_chat,"Przez nieznane zródlo straciles %d kasy i masz jej teraz:%d",premia,ilosc);
}

przyklad nr2 zmniejsza on kasę którą dostajemy o 50%
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <Money>

#define PLUGIN "TestAPI2"
#define VERSION "1.0"
#define AUTHOR "G[o]Q"


public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR)
    
    register_clcmd("dajkase","dodaj_kase");
    register_clcmd("ustaw_kase","ustaw_kase");
}
public dodaj_kase(id)
    add_user_money(id,100,1,0);
public ustaw_kase(id)
    set_user_money(id,1000,1);
    
public MoneyAddToPlayer(id,ilosc,premia,zrodlo){
    new percent=50;
    new kasa=ilosc-premia+(premia/(100/percent));
    if(premia>0){
        client_print(id,print_chat,"Rząd zabral ci %d%s podatku VAT.",percent,"%%")
        client_print(id,print_chat,"Wiec zarobiles tylko %d i stan twojego konta to:%d.",premia/(100/percent),kasa)
    }else{
        client_print(id,print_chat,"Dostales mandat w wysokosci:%d,ale Pan policjant dal ci znizke: %d%s",premia,percent,"%%")
        client_print(id,print_chat,"Wiec straciles tylko %d i stan twojego konta to:%d.",premia/(100/percent),kasa)    
    }
    set_user_money_silent(id,kasa,0);
        
}

Załączone pliki


  • +
  • -
  • 4


#9646 Eventy

Napisane przez Miczu w 02.07.2008 15:13

Postaram sie przedstawic najwazniesze eventy do cs'a, wraz z codem wystarczajacym do pozniejszego korzystania z niego O:)

Ps. podam tylko sprawdzone metody i nie będę przytaczal jakie sa bledne metody (szczegolnie nowa runda jest pare metod w tym 1 bledna, czesto stosowana).

Start mapy


plugin_init()
{
	//code
}
Powyzsza funkcja jest tylko wywolywana po zmianie mapy (na samym jej poczatku).

Koniec mapy


plugin_end ( )
{
	//code
}
Powyzsza funkcja jest wywolywana przy zmianie mapy lub prawidlowym zamknieciu serwera. Prawdopodobnie nie wychwyci crasha.

Nowa Runda


#include <amxmodx>
#include <amxmisc>
 
public plugin_init() {
	register_event("HLTV", "Nowa_Runda", "a", "1=0", "2=0")
}
 
public Nowa_Runda()
{
	//code
}
Nowa runda tym sposobem omija pierwsza runde - pierwsza po zmianie mapy.
#mozliwe problemy gdy w tym evencie np: operacje na graczu typu danie broni(potwierdzone)...

Poczatek Rundy


Poczatek rudny to jak sie freeze skonczy - mozna sie ruszac ;-)
#include <amxmodx>
#include <amxmisc>
 
public plugin_init() {
	register_logevent("Poczatek_Rundy", 2, "1=Round_Start")  
}
 
public Poczatek_Rundy()
{
	//code
}

Koniec Rundy


Przeciwnik zabity/Bomba wybuchla/Bomba zostala rozbrojona/zakladnicy uwolnieni/minol czas rudny
#include <amxmodx>
#include <amxmisc>
 
public plugin_init() {
	register_logevent("Koniec_Rundy", 2, "1=Round_End")
}
 
public Koniec_Rundy()
{
	//code
}

Damage - obrazenia


#include <amxmodx>
#include <amxmisc>
 
public plugin_init() {
	register_event("Damage", "Damage", "b", "2!=0")
}
 
public Damage(id)
{
	new vid = read_data(0) // vid == id
	
	new damage = read_data(2)
	
	new Origins[3]			// Wspolrzedne gracza, granatu, obiektu wywolujacego obrazenia
	Origins[0] = read_data(4)
	Origins[1] = read_data(5)
	Origins[2] = read_data(6)
	
	new kid = get_user_attacker(id)	// Gracz atakujacy
 
	//code
	
}

DeathMsg - ktos umarl


#include <amxmodx>
#include <amxmisc>
 
public plugin_init() {
	register_event("DeathMsg", "DeathMsg", "a")
}
 
public DeathMsg()
{
	new kid = read_data(1)	//zabojca
	
	new vid = read_data(2)	// ofiara
	
	new hs = read_data(3)	// HeadShot (1 == true)
	
	new weapon[64]		
	read_data(4,weapon,63)	//krotka nazwa broni (bez weapon_ / CSW_ )
 
	//code
}
kid i vid sa sobie rowne gdy zabije cie wlasna bron (granat) lub np. admin uzyje slay'a...

kid == 0 gdy np. spadniesz z wysokiej wysokosci...

CurWeapon - obecna bron



Wykrywa zmiane broni - takze gdy sie sawnujesz dostajesz nowa bron i funkcja tez jest wywolana.

#include <amxmodx>
#include <amxmisc>
 
public plugin_init() {
	register_event("CurWeapon","CurWeapon","be", "1=1")
}
 
public CurWeapon(id)
{
	new wid = read_data(2)	// Id broni
	new ammo = read_data(3)	// liczba naboi w magazynku
	//code
}

Noz, granaty itp. maja ammo = -1

Info-bronie

Z testow wynika, ze w/w event jest tez wywolywany po wystrzeleniu naboju (ammo sie zmienia) lub po przeladowaniu.

Podniesienie broni



Podniesie broni a takze kupienie. Na starcie rundy sie uruchomi gdy dostajemy noz i pistolet (2 razy). Jest wywolywany takze gdy kupimy cos, ale nie bedziemy mieli tego w rekach (np. granat).

#include <amxmodx>
#include <amxmisc>
 
public plugin_init() {
	register_event("WeapPickup", "WeapPickup", "b")
}
 
public WeapPickup(id)
{
	new wid = read_data(1) // id broni
 
	//code
}

Nie liczy podniesienia Shilda oraz kupienia defa, noktowizora czy kamizelki Dołączona grafika

Podniesienie amunicji



Jak kupujemy amunicje to clip daje nam wartosc ile nam przybylo. Jesli podniesiemy M4A1 co ma 24 w broni i 90 w zapasie to clip bedzie mial wartosc 90, a nie 114. Jak drop'niemy i podniesiemy wlasna bron to event nie zostanie wywolany.

#include <amxmodx>
#include <amxmisc>
 
public plugin_init() {
	register_event("AmmoPickup", "AmmoPickup", "b")
}
 
public AmmoPickup(id)
{
	new aid = read_data(1)   //id amunicji
	new clip = read_data(2)  //ilosc naboi
	
	//code
}

Amunicja



Aktualny stan amunicji w 'zapasie'. Jak kupujemy ammo to clip ma laczna wartosc naboi w magazynku. Jak podniesiemy po kims bron np. AK 25 i 90 w zapasie to clip wynosi 90.

Na poczatku rundy wszystkie typy naboi za wyjatkiem tych do ktorych mamy bron sa zerowane. Jak kupujemy granaty to clip ma wartosc rowna ilosci danego typu np. flash max 2...
#include <amxmodx>
#include <amxmisc>
 
public plugin_init() {
	register_event("AmmoX", "AmmoX", "b")
}
 
public AmmoX(id)
{
	new aid = read_data(1)
	new clip = read_data(2)
	
	client_print(id,print_chat,"id %d aid %d clip %d",id,aid,clip)
 
	//code
}

Wejscie na server


Juz widzisz mape ;-)
public client_putinserver(id){
	//code
}

Polaczenie z serwerem


Czyli gdy np. w konsoli napiszesz connect IP:PORT
public client_connect(id)
{
	//code
}

Rozlaczenie sie z serwerem



public client_disconnect(id)
{
	//code
}

Health - Zycie


#include <amxmodx>
#include <amxmisc>
 
public plugin_init() {
	register_event("Health", "Health", "be")
}
 
public Health(id)
{
	new health = read_data(1)
 
	//code	
}


Money - zmiana w kasie


#include <amxmodx>
#include <amxmisc>
 
public plugin_init() {
	register_event("Money", "Money", "be")
}
 
public Money(id)
{
	new Money = read_data(1)
 
	//code	
}





TeamInfo - informacjie o Teamie



Ogolny wyglad eventu:
#include <amxmodx>
#include <amxmisc>
 
public plugin_init()
{
	register_event("TeamInfo","team_assign","a")
}
 
public team_assign()
{
	new id = read_data(1)
	new Team[32]
	read_data(2,Team,31)	//UNASSIGNED
				//TERRORIST
				//CT
				//SPECTATOR
}

Ale trzeba sie tu pilnowac! Z moich badan wynika ze event jest wywolywany za kazdym spawnem i dodatkowo przy wyborze z menu teamu.

Jesli chcemy wykrywac autentyczna zmiane druzyny musimy zastosowac taki zabieg (chyba najoptymalniej i do tego czysto):
#include <amxmodx>
#include <amxmisc>
 
public plugin_init()
{
	register_event("TeamInfo","team_assign","a")
}
 
public team_assign()
{
	static old_team[33]
	new tid
	new id = read_data(1)
	new Team[32]
	read_data(2,Team,31)	//UNASSIGNED
				//TERRORIST
				//CT
				//SPECTATOR
	if(equal(Team,"UNASSIGNED")) tid = 0
	else if(equal(Team,"TERRORIST")) tid = 1
	else if(equal(Team,"CT")) tid = 2
	else if(equal(Team,"SPECTATOR")) tid = 3
	
	if(old_team[id]==tid) return PLUGIN_CONTINUE	//jesli druzyna sie nie zmienila to przerywamy event
	
	old_team[id] = tid				//zapisujemy nowy team
	
	/*code
	
	//koniec code */
	return PLUGIN_CONTINUE 		// skoro juz uzylismy returna to musimy tez na koniec go dac
}

=================================================

Eventy wywolane przez:
register_logevent
nie maja parametru id - a mowiac inaczej jak dodamy parametr id, to bedzie mial wartosc 0

=================================================

Flagi do eventow:

"a" - Global Event - wysylany do all graczy (mozliwy jest brak mozliwosci podpiecia id do eventu np. DeathMsg)
"b" - Event sent to a single target - do konkretnego gracza (zwiazany z pojedynczym graczem - demage)
"c" - Send only once when repeated to other players - tylko raz gdy jest powtarzany u innych graczy.
"d" - Only if sent to a dead player - tylko u martwych graczy
"e" - Only if sent to an alive player - tylko u zywych graczy ( przed wersja 1.80 jest bug, wiec i tak wypada sprawdzac is_user_alive(id) )


PS. Jak będę mial czas to dodam wiecej O:)
PS2. Jak cos nie dziala to dajcie znac, bo nie wszystko mialem czas sprawdzic przed daniem na forum.

PS3. Jestem autorem tego poradnika i wolno tylko kopiowac za moja zgoda... Nie [you] nie mozesz kopiowac!
  • +
  • -
  • 60


#27095 set_task - funkcje czasowe

Napisane przez Miczu w 09.12.2008 11:08

Często bywa tak, że chcemy by jakaś akcja w cs'ie odbyła się z pewnym opóźnieniem lub trwała jakiś czas. Najbardziej podstawowym sposobem by to wykonać, jest użycie funkcji set_task - jest ona podstawową funkcja amxx'a.

Konstrukcja tej funkcji ma postać:

set_task ( Float:time, const function[], id = 0, parameter[]="", len = 0, flags[]="", repeat = 0 )

Omówie teraz poszczególne parametry:

time (typ float - zmienno przecinkowy) - tu podajemy czas w sekundach po jakim ma być wywołana funkcja. Może to być liczba znana już przed kompilacją (np 10.0 - zawsze dajemy wartość po przecinku, nawet jak jest to liczba całkowita). Może to też być zdeklarowana zmienna typu float o dowolnej wartości (choć rozsądek podpowiada by to były liczby nie ujemne ;> )

function[] - jak nam zdradza oznaczenie ' [] ' zmienna ta zbudowana jest z ciągu znakowego. Ciąg ten musi być nazwą funkcji w naszym plugu.

id - zmienna id oznacza nr identyfikacyjny naszego task'a. Jeśli jej nie zdeklarujemy (tj. użyjmy taska tylko z 2 parametrami), to id będzie miało wartość 0. Istotną rzeczą, jak też często pomijaną przez programistów jest zadbanie by nasz task miał jedyną w swoim rodzaju nr. id.

Znajomość id taska daje nam dostęp do następujących funkcji:

task_exists ( id = 0, outside = 0 ) - sprawdzanie czy task o podanym id istnieje
change_task ( id = 0, Float:newTime=1.0, outside = 0 ) - zmienianie czasu wywołania taska
remove_task ( id = 0, outside = 0 ) - usuwa taska o podanym id - funkcja nie zostaje wywołana a dane zawarte w tasku zostają utracone.

outside - gdy wartość jest równa 1 to są też brane taski z poza naszego pluga.

parameter - tutaj możemy przechowywać dowolnie wiele danych dla wywołanej danym taskiem funkcji. Parameter działą razem ze zmienną len w której jest zawarta informacja o ilości elementów w zmiennej parameter.

przykład:

...
new data[3]
data[0] = id
data[1] = vid
data[2] = dmg

set_task ( 5.0, "DoIt", 666, data, 3 )
...
public DoIt(data[])
{
new id = data[0]
new vid = data[1]
new dmg = data[2]
}

Jesli przekazujemy tylko jedna informacje typu int, to możemy użyć zmiennej id do przekazania informacji:

...
set_task ( 5.0, "KillIt", id )
...
public KillIt(id)
{
user_silentkill ( id)
}

flags - tu są przechowywane flagi typu wykonywanego tasku - gdy nie jest on zdefiniowany to task jest wykonywany 1 raz po określonym czasie od momentu wywołania. Mamy do dyspozycji flagi:
"a" - powtarza funkcje określoną liczbę razy (zmienna repeat ) - po wywołaniu funkcji zostaje jakoby zrobiony nowy task z takim samym opóźnieniem.
"b" - bardzo podobna do flagi z "a" tylko z 1 wyjątkiem - task będzie zapętlany aż do zmiany mapy lub do usunięcia taska.
"c" - wykonywana po czasie "timeleft"
"d" - wykonywana przed czasem "timeleft"

PS. Jak znajde troche czasu i będę na swoim PC, to postaram się rozwinąć topic.
PS2. W taki oto sposób udało mi sie nie zanudzić na śmierć między wykładami xD
  • +
  • -
  • 18