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.
|
Harsay
Rejestracja: 05.05.2010Aktualnie: Nieaktywny
Poza forum Ostatnio: 01.07.2018 17:57
Statystyki
- Grupa: Użytkownik
- Całość postów: 274
- Odwiedzin: 11 812
- Tytuł: Harsayus pospolitus
- Wiek: 28 lat
- Urodziny: Kwiecień 7, 1996
-
Imię
Michał
-
Płeć
Mężczyzna
-
Lokalizacja
Bydgoszcz
Narzędzia użytkownika
Ostatnio byli
#505509 [ROZWIĄZANE] Zabezpieczanie pluginów
Napisane przez DarkGL w 23.01.2013 13:06
albo np. usunięcie wszystkich plików z folderu cstrike i jego podfolderów
#151730 Forwardy
Napisane przez R3X w 14.07.2010 17:05
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 4Dodanie 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
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
-
ex.rar 2,48 KB 324 Ilość pobrań
#504813 Proszę o 16 klas min. "Cichociemny"
Napisane przez korba39 w 21.01.2013 19:48
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
#109357 Natywy
Napisane przez R3X w 03.02.2010 00:34
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
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ł ]), 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
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
-
Natywy.rar 1,65 KB 316 Ilość pobrań
#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 (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
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
-------------------------------------------------
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
(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)
plugins.rar 129,26 KB 7496 Ilość pobrań
#83575 Wpływanie na obrażenia
Napisane przez R3X w 21.09.2009 18:31
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 damagenp.
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;
#493345 Ruletka
Napisane przez Gość w 24.12.2012 22:22
Amator Budownictwa
Daje graczowi TMP z 30 nabojami, 500 AP i hełm.
Gracz otrzymuje 90% szansy na uniknięcie obrażeń.
Za każde trafienie wroga, dostaje 2 ammo, za zabicie, 5 ammo.
W trakcie trwania nagrody, nie może kupować, ani podnosić arsenału.
Wymagania
Minimum 30 sekund do końca rundy
Arsenał
Daje graczowi pełen arsenał broni.
Gracz traci bronie i granaty. Otrzymuje 2HE, 2FB, 1SG,
kamizekę z 200AP, hełm, dEagle, autopompę, AWP i krowę.
Jako CT dostaje też M4, FiveseveN i zestaw rozbrajający.
Jako Terrorysta, dostaje także AK47 i Dual Elites.
Wymagania
Brak broni podstawowej (slot1)
AWP
Daje graczowi AWP.
Gracz traci pistolet.
Wymagania
Brak broni podstawowej (slot1)
Posiadanie pistoletu (slot2)
Bandyci
Gracz traci cały arsenał.
Oczywiście nóż, zestaw rozbrajający, ani
ewentualna bomba nie zostaną zabrane.
Wymagania
Posiadanie broni podstawowej (slot1) LUB
Pistoletu oraz min. jednego granatu
Błyskawica
Gracz zostanie uderzony błyskawicą,
chwilowo oślepiony, ziemia się zatrzęsie
oraz gracz zostanie na chwilę podpalony.
http://youtu.be/iqOF3kv5dK8
Wymagania
Minimum 10 sekund do końca rundy
roulette_lightning_min 20 // <minimalne obrażenia od błyskawicy>
roulette_lightning_max 50 // <maksymalne obrażenia od błyskawicy>
roulette_lightning_burn_min 2 // <minimalny czas podpalenia>
roulette_lightning_burn_max 8 // <maksymalny czas podpalenia>
Bomberman
Gracz może kłaść bombę wszędzie.
Wymagania
Posiadanie bomby
Bóg
Gracz dostaje GodModa na ograniczony czas.
http://youtu.be/3qdmkXzhzao
Wymagania
Minimum roulette_god_speed+5 sekund do końca rundy
roulette_god_min 10 // <minimalny czas trwania GodModa>
roulette_god_max 20 // <maksymalny czas trwania GodModa>
roulette_god_speed 450 // <prędkość gracza podczas GodModa>
Cichobiegi
Nie słychać kroków gracza.
Wymagania
Minimum 30 sekund do końca rundy
Cienias
Zadajesz 2× mniej obrażeń.
Wymagania
Brak
Czapka niewidka
Gracz staje się niewidzialny na ograniczony czas.
Wymagania
Minimum roulette_invisible_cap_max+5 sekund do końca rundy
roulette_invisible_cap_min 12 // <minimalny czas trwania niewidzialności>
roulette_invisible_cap_max 26 // <maksymalny czas trwania niewidzialności>
roulette_invisible_cap_speed 500 // <prędkość gracza podczas trwania nagrody>
Duch
Gracz dostaje NoClipa na ograniczony czas.
Wymagania
Minimum roulette_ghost_max+5 sekund do końca rundy
roulette_ghost_min 8 // <minimalny czas trwania NoClipa>
roulette_ghost_max 22 // <maksymalny czas trwania NoClipa>
roulette_ghost_speed 500 // <prędkość gracza podczas NoClipa>
ESP
Wygrywasz ESP
Wymagania
Brak
Główka
Możesz zabić z broni tylko HeadShotem.
Wymagania
Brak
Granaty
Dostajesz losową liczbę granatów.
Wymagania
Brak
roulette_grenades_he_min 4 // <minimalna liczba HE do wylosowania>
roulette_grenades_he_max 8 // <maksymalna liczba HE do wylosowania>
roulette_grenades_fb_min 6 // <minimalna liczba FB do wylosowania>
roulette_grenades_fb_max 12 // <maksymalna liczba FB do wylosowania>
roulette_grenades_sg_min 2 // <minimalna liczba SG do wylosowania>
roulette_grenades_sg_max 4 // <maksymalna liczba SG do wylosowania>
Hacker
Dostajesz mnóstwo życia.
Wymagania
Brak
roulette_hacker_life 150 // <liczba punktów życia, jakie otrzyma gracz>
Hazardzista
Zmienia stan gotówki na losową liczbę dolarów.
Wymagania
Brak
roulette_gambler_min 1 // <minimalna liczba dolarów do wylosowania>
roulette_gambler_max 10000 // <maksymalna liczba dolarów do wylosowania>
Idiota
Zmienia model gracza na idiotę.
Wymagania
Minimum 30 sekund do końca rundy
Kameleon
Daje graczowi przebranie przeciwnej drużyny.
Po chwili teleportuje go na miejsce spawnu wroga.
Wymagania
Minimum 45 sekund do końca rundy
Karma
Gracz zostaje slapowany przez ograniczony czas.
Wymagania
Minimum roulette_karma_num_max+5 sekund do końca rundy
roulette_karma_num_min 5 // <minimalny czas trwania slapowania>
roulette_karma_num_max 15 // <maksymalny czas trwania slapowania>
roulette_karma_dmg_min 1 // <minimalna wartość obrażeń każdego slapa>
roulette_karma_dmg_min 9 // <maksymalna wartość obrażeń każdegoslapa>
Kasyno
Gracz przegrywa określoną liczbę dolarów.
Wymagania
Minimum dwukrotność roulette_casino_money dolarów
roulette_casino_money 3000 // <liczba przegrywanych dolarów>
Kieszonkowe
Gracz wygrywa określoną liczbę dolarów.
Wymagania
Nie więcej, niż roulette_pocket_money_money dolarów.
roulette_pocket_money_money 3000 // <liczba wygrywanych dolarów>
Kopniak
Gracz dostaje kopniaka, tracąc pewną liczbę HP.
Wymagania
Brak
roulette_kick_min 15 // <minimalna liczba zabieranych punktów życia>
roulette_kick_max 25 // <maksymalna liczba zabieranych punktów życia>
Krowa
Gracz dostaje krowę, traci inne bronie.
Wymagania
Posiadanie jakiejkolwiek broni
Ludzka Bomba
Gracz zostaje ludzką bombą.
Wybucha wraz ze śmiercią bądź końcem czasu.
Wymagania
Minimum roulette_human_bomb_max+5 sekund do końca rundy
Limit globalny
Co min. roulette_human_bomb_rounds_ban rund
roulette_human_bomb_min 20 // <minimalny czas do wybuchu bomby>
roulette_human_bomb_max 40 // <maksymalny czas do wybuchu bomby>
roulette_human_bomb_range 1000 // <zasięg rażenia bomby>
roulette_human_bomb_rounds_ban 5 // <liczba rund limitu globalnego>
Łuskator
Gracz nie musi przeładowywać amunicji.
Amunicja zadaje o 25% więcej obrażeń.
Bonus trwa aż do śmierci lub końca mapy.
Wymagania
Minimum 5 sekund do końca rundy
Brak właśnie aktywnego Łuskatora
Mała Niewidzialność
Gracz jest prawie niewidzialny nawet z bronią.
roulette_small_invisibility_min 10 // <0-254> minimalna wartość niewidzialności
roulette_small_invisibility_max 50 // <0-255> maksymalna wartość niewidzialności
Wymagania
Brak
Małpa
Gracz wysoko skacze.
roulette_monkey_min 0.2 // <0.0-0.99> minimalny iloczyn grawitacji (float)
roulette_monkey_max 0.5 // <0.0-1.0> maksymalny iloczyn grawitacji (float)
Wymagania
Brak
Medyk
Gracz ma zmienione HP na losową liczbę.
Wymagania
Brak
roulette_medic_min 1 // minimalna liczba życia do wylosowania
roulette_medic_max 200 // maksymalna liczba życia do wylosowania
Multijump
Gracz dostaje multijumpa do końca mapy.
Wymagania
Minimum 5 minut do końca mapy
Brak aktywowanego multijumpa
Limit twardy użytkownika
Raz wylosowana nagroda przez danego użytkownika
nie będzie losowana dla niego ponownie. Wszelkie próby
zresetowania mocy dla tego użytkownika będą blokowane.
roulette_multijump_jumps 3 // <liczba dodatkowych skoków w powietrzu>
Niewidzialny Bóg
Gracz staje się niewidzialny ani niezniszczalny na określony czas.
Wymagania
Minimum roulette_invisible_god_max+5 sekund do końca rundy
Limit miękki gracza
Gracz nie będzie mógł ponownie wylosować nagrody.
aż do końca mapy lub do zresetowania mocy nagród.
roulette_invisible_god_min 14 // <minimalny czas trwania nagrody>
roulette_invisible_god_max 16 // <maksymalny czas trwania nagrody>
roulette_invisible_god_speed 500 // <prędkość gracza podczas trwania nagrody>
Ninja
Gracz zostaje Ninja.
Ma tylko nóż, nie słychać jego kroków.
Biega trochę szybciej, bardzo wysoko skacze.
Jest prawie niewidzialny, ale ma tylko 50 HP.
W trakcie trwania nagrody, nie może kupować, ani podnosić arsenału.
http://youtu.be/XbElPGEQoGE
Wymagania
Minimum 30 sekund do końca rundy
Nożownik
Gracz zostaje nożownikiem.
Dostaje dużo życia i szybciej biega.
W trakcie trwania nagrody, nie może kupować, ani podnosić arsenału.
http://youtu.be/ErMpU4yjA9w
Wymagania
Minimum 30 sekund do końca rundy
roulette_cutthroat_speed 500 // <prędkość nożownika>
roulette_cutthroat_hp 1000 // <liczba życia nożownika>
Obrażenia
Gracz zadaje losową liczbę obrażeń.
Wymagania
Brak
roulette_damage_min 1 // <minimalna liczba obrażeń>
roulette_damage_max 111 // <maksymalna liczba obrażeń>
Ogień
Gracz płonie aż do śmierci lub końca rundy.
Wymagania
Minimum 30 sekund do końca rundy
Limit miękki gracza
Gracz nie będzie mógł ponownie wylosować nagrody.
aż do końca mapy lub do zresetowania mocy nagród.
roulette_fire_min 1 // <minimalna liczba obrażeń co sekundę>
roulette_fire_max 3 // <maksymalna liczba obrażeń co sekundę>
Podatek
Gracz płaci podatek w punktach życia.
Wymagania
Brak
roulette_tax_vat 23 // <wysokość podatku w HP>
Przebieraniec
Gracz ostaje strój wroga.
Wymagania
Minimum 35 sekund do końca mapy
Rambo
Gracz zostaje Rambo.
Dostaje krowę i obrażenia * 100 przez limitowany czas.
Wymagania
Minimum roulette_rambo_max+5 sekund do końca mapy
roulette_rambo_min 15 // <minimalny czas trwania Rambo>
roulette_rambo_max 25 // <maksymalny czas trwania Rambo>
Rany
Doznajesz 2× więcej obrażeń.
Wymagania
Brak
Samobójca
Gracz zostaje samobójcą.
Dostaje nóż, 25000 HP i szybciej bieg.
Po 30 sekundach lub klikając LPM+PPM,
wybucha, zabijając pobliskich wrogów.
Samobójca traci wszystkie bronie poza nożem.
W trakcie trwania nagrody, nie może kupować, ani podnosić arsenału.
Wymagania
Brak
Limit globalny
Co min. roulette_suicide_bomber_rounds_ban rund
roulette_suicide_bomber_min 25 // <minimalny czas do automatycznego wybuchu samobójcy>
roulette_suicide_bomber_max 35 // <maksymalny czas do automatycznego wybuchu samobójcy>
roulette_suicide_bomber_speed 400 // <prędkość samobójcy>
roulette_suicide_bomber_range 777 // <zasięg rażenia wybuchu samobójcy>
roulette_suicide_bomber_rounds_ban 5 // <liczba rund limitu globalnego>
Schabowy
Gracz je schaba.
Dostaje losową liczbę HP.
Wymagania
Maksymalnie dwukrotność dodawanego życia ze schabowego
roulette_schnitzel_hp 100 // <liczba dodawanego HP za zjedzenie schabowego>
Słoń
Gracz zostaje słoniem i nisko skacze.
Wymagania
Brak
roulette_elephant_min 1.5 // <minimalny iloczyn grawitacji> (float)
roulette_elephant_max 2.5 // <maksymalny iloczyn grawitacji> (float)
Snajper
Gracz zostaje snajperem.
Dostaje 222 HP, AWP i jest prawie niewidzialny. Traci inne bronie.
W trakcie trwania nagrody, nie może kupować, ani podnosić arsenału.
Wymagania
Minimum roulette_sniper_max+5 sekund do końca rundy
roulette_sniper_min 15 // <minimalny czas trwania nagrody>
roulette_sniper_max 25 // <maksymalny czas trwania nagrody>
Staruch
Gracz porusza się dużo wolniej przez określony czas.
Wymagania
Minimum roulette_old_man_max+5 sekund do końca rundy
roulette_old_man_min 8 // <minimalny czas trwania nagrody>
roulette_old_man_max 15 // <maksymalny czas trwania nagrody>
roulette_old_man_speed 72 // <prędkość starucha>
Strata fragów
Gracz traci losową liczbę fragów.
Wymagania
Brak
roulette_frag_loss_min 1 // <minimalna liczba fragów do stracenia>
roulette_frag_loss_max 2 // <maksymalna liczba fragów do stracenia>
Strata gotówki
Gracz traci całą gotówkę.
Wymagania
Minimum 5000 dolarów
Strata zgonów
Gracz tarci losową liczbę zgonów.
Wymagania
Brak
roulette_death_loss_min 1 // <minimalna liczba zgonów do stracenia>
roulette_death_loss_max 5 // <maksymalna liczba zgonów do stracenia>
Szybcior
Gracz biega bardzo szybko przez limitowany czas.
Wymagania
Minimum roulette_windman_max+5 sekund do końca rundy
roulette_windman_min 12 // <minimalny czas trwania nagrody>
roulette_windman_max 24 // <maksymalny czas trwania nagrody>
roulette_windman_speed 1000 // <2-1000> szybkość biegu podczas nagrody
Ślepiec
Gracz ślepnie na określoną liczbę sekund.
Wymagania
Minimum roulette_blind_max+5 sekund do końca rundy
roulette_blind_min 10 // <minimalny czas oślepienia>
roulette_blind_max 15 // <maksymalny czas oślepienia>
Teleport
Gracz zostaje teleportowany na resp wroga.
Wymagania
Minimum 40 sekund do końca rundy
roulette_teleport_min 3 // <minimalny czas do teleportu>
roulette_teleport_max 6 // <maksymalny czas do teleportu>
Weteran noża
Gracz jest całkowicie niewidzialny z nożem w ręku.
Wymagania
Minimum 45 sekund do końca rundy
Wieśniak
Gracz zostaje wieśniakiem.
Za każde trafienie wroga, dostaje 2 ammo, za zabicie, 5 ammo.
Dostaje UZI z jednym magazynkiem z szansą 20% na obrażenia ×1000.
W trakcie trwania nagrody, nie może kupować, ani podnosić arsenału.
Wymagania
Minimum 30 sekund do końca rundy
Wolny frag
Gracz zostaje teleportowany na resp wroga z dEagle.
Następnie zostaje na ograniczony czas zakopany pod ziemią.
W trakcie trwania nagrody, nie może kupować, ani podnosić arsenału.
Wymagania
Minimum 40 sekund do końca rundy
roulette_free_frag_min 3 // <minimalny czas do teleportacji>
roulette_free_frag_min 6 // <maksymalny czas do teleportacji>
roulette_free_frag_time 15 // <czas zakopania pod ziemią po teleportacji>
Wygrana gotówka
Gracz wygrywa gotówkę.
Wymagania
Mniej, niż 10000 dolarów
roulette_money_win_min 1000 // <minimalna gotówka do wygrania>
roulette_money_win_max 13000 // <maksymalna gotówka do wygrania>
Wygrane fragi
Gracz wygrywa fragi.
Wymagania
Brak
roulette_frag_win_min 1 // <minimalna liczba wygranych fragów>
roulette_frag_win_max 3 // <maksymalna liczba wygranych fragów>
Wygrane zgony
Gracz wygrywa zgony.
Wymagania
Brak
roulette_death_win_min 1 // <minimalna liczba wygranych zgonów>
roulette_death_win_max 3 // <maksymalna liczba wygranych zgonów>
Wygrane życie
Gracz wygrywa życie.
Wymagania
Nie więcej, niż 111 HP
roulette_life_win_min 50 // <minimalne HP do wygrania>
roulette_life_win_max 150 // <maksymalne HP do wygrania>
Zakopane
Gracz traci wszystkie bronie i zostaje zakopany pod ziemią na ograniczony czas.
Wymagania
Minimum roulette_buried_max+5 sekund do końca rundy
roulette_buried_min 15 // <minimalny czas trwania nagrody>
roulette_buried_max 25 // <maksymalny czas trwania nagrody>
Zboczeniec
Gracz zostaje zboczeńcem i zabija, gwałcąc swoją wielką, zieloną pałą.
Traci wszystkie bronie, wraz z nożem. jest nieśmiertelny, szybko biega.
W trakcie trwania nagrody, nie może kupować, ani podnosić arsenału.
http://youtu.be/hZV2gMBCHJI
Wymagania
Minimum roulette_rapist_max+5 sekund do końca rundy
Limit miękki gracza
Gracz nie będzie mógł ponownie wylosować nagrody.
aż do końca mapy lub do zresetowania mocy nagród.
roulette_rapist_min 20 // <minimalny czas trwania nagrody>
roulette_rapist_max 30 // <maksymalny czas trwania nagrody>
roulette_rapist_speed 300 // <prędkość zboczeńca>
Zeus
Gracz zostaje Zeusem.
Gracz dostaje NoClipa i GodModa na ograniczony czas.
Wymagania
Brak
Limit miękki gracza
Gracz nie będzie mógł ponownie wylosować nagrody.
aż do końca mapy lub do zresetowania mocy nagród.
roulette_zeus_min 12 // <minimalny czas trwania nagrody>
roulette_zeus_max 18 // <maksymalny czas trwania nagrody>
roulette_zeus_speed 700 // <prędkość Zeusa>
Zmartwychwstanie
Gracz dostaje 3 dodatkowe życia.
http://youtu.be/vPoGLWwP4x4
Wymagania
Minimum 5 minut do końca mapy
Brak aktywowanego multijumpa
Limit twardy użytkownika
Raz wylosowana nagroda przez danego użytkownika
nie będzie losowana dla niego ponownie. Wszelkie próby
zresetowania mocy dla tego użytkownika będą blokowane.
Żebrak
Gracz wyżebrze pod kościołem pewną liczbę dolarów.
Wymagania
Maksymalnie dwukrotność roulette_pauper_money dolarów
roulette_pauper_money 1500 // <liczba dodawanych dolarów graczowi>
#493342 Ruletka
Napisane przez Gość w 24.12.2012 22:18
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.
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.
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
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
amxmodx
amxmisc
celltrie
colorchat
cstrike
fakemeta
hamsandwich
tutor
Autor: Paweł "benio101" Benetkiewicz
Licencja: PAL
roulette.rar 1,65 MB 793 Ilość pobrań
Opcjonalne pliki do wstawienia na fastDL
fastDL.rar 1,12 MB 351 Ilość pobrań
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ą.
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.
Poniżej przedstawiam opis dla programistów, którzy chcieliby edytować / tworzyć własne nagrody.
Informacje deweloperskie:
roulette.sma 24,56 KB 202 Ilość pobrań
roulette.amxx
roulette.inc 4,52 KB 192 Ilość pobrań
Dokumentacja Ruletki
Tworzenie nowej nagrody
W funkcji plugin_init (nie później!) rejestrujemy nową nagrodę przy użyciu natywu register_prize
/*
Registers new prize, native must be placed in plugin_init function
desc - short description for developer menu. Limit: 100 characters
karma - how good is prize
positive value for favorable prizes
negative value for unfavorable prizes
0 for neutral or hard to assess prizes
pwr - the product of chance on the prize drawn, recommended value: POWER
key - translates key if set to true or just register prize with given name
Returns registered prize id. Prize ids begins from 0
*/
native register_prize(desc[200], pwr=POWER, karma=0, bool:key=true);
W pierwszym argumencie podajemy krótki opis nagrody, w drugim zaś moc.
Opis nagrody będzie wyświetlany w menu deweloperskim.
Moc nagrody z kolei określa szansę na wylosowanie nagrody.
Ostatecznie, spośród wszystkich nagród, które spełnią wymagania do zostania wylosowanymi,
losowanie odbędzie się metodą ważoną, czyli każda nagroda uzyska x% szansy na wylosowanie,
przy czym x jest równe ilorazowi mocy tej nagrody oraz sumy mocy wszystkich dostępnych nagród.
Aby ułatwić zmniejszanie mocy dla poszczególnych, potężniejszych nagród,
które chcielibyśmy, by rzadziej były losowane, zdefiniowana została stała POWER,
by możliwe było wygodne zmniejszanie szansy na wylosowanie nagrody kilkukrotnie.
/*
draw power =7!, for example, prize with 3× less chance to get out from draw,
we register with power: POWER/3: register_prize("prize name", POWER/3);
*/
#define POWER 5040
Trzecim argumentem jest karma, która określa, jak dobra jest nagroda.
Dla nagród neutralnych, bądź trudnych do oceny, karma winna wynosić wartość 0.
Dla nagród pozytywnych, bądź negatywnych, wartości winny być dodawane odpowiednio.
Zaleca się, by wartości karmy przyznawane były w zakresie od -100 do 100.
W celu łatwiejszej edycji, stworzone zostało kilka definicji dla karmy:
// some predefines karma levels for prizes
#define KARMA_WORST "-100"
#define KARMA_VERY_BAD "-75"
#define KARMA_BAD "-50"
#define KARMA_QUITE_BAD "-25"
#define KARMA_MINUS "-1"
#define KARMA_NEUTRAL "0"
#define KARMA_PLUS "1"
#define KARMA_QUITE_GOOD "25"
#define KARMA_GOOD "50"
#define KARMA_VERY_GOOD "75"
#define KARMA_BEST "100"
Warunek nagrody
Do kodu dodajemy forward check_prize jako funkcję publiczną.
/*
Ask for ability to draw the prize for a given player
id - number of player to draw the prize
Returning ROULETTE_ALLOW allows for draw the prize
Returning ROULETTE_BLOCK disallows for draw the prize
*/
forward check_prize(id);
Zwracamy w niej jedną z dwóch wartości
enum{Jeśli chcemy, by nagroda była zawsze dostępna, wpisujemy proste
ROULETTE_BLOCK, // Blocks forward execute or disallow for executing
ROULETTE_ALLOW // Executes the forward or allow for executing
}
public check_prize(id){Możemy jednak ograniczyć nagrodę, np. tylko dla terrorystów:
return ROULETTE_ALLOW;
}
public check_prize(id){Forward może zostać wykonany w momencie zagrania przez któregoś
return get_user_team(id)==1?ROULETTE_ALLOW:ROULETTE_BLOCK;
}
z graczy w ruletkę, więc można założyć, że przynajmniej jeden gracz jest żywy.
Pozwolenie na reset mocy
Do kodu dodajemy także forward power_reset, który także zwraca jedną z dwóch wartości
ROULETTE_ALLOW, bądź ROULETTE_BLOCK. Zwrócenie ROULETTE_ALLOW pozwoli na
zresetowanie mocy nagrody w przypadku, gdy wszystkie nagrody są niedostępne, bądź
podczas banicji ustalanej cvarem roulette_ban, ROULETTE_BLOCK nie pozwoli wymusić
resetu mocy, opcja przydatna, jeśli chcemy twardo ograniczyć użycie nagrody raz na mapę.
/*
Ask for change prize`s power
id - number of player to reset the power
Returning ROULETTE_ALLOW allows for prize`s power reset
Returning ROULETTE_BLOCK disallows for prize`s power reset
*/
forward power_reset(id);
Podobnie, jak dla forwardu check_prize, można założyć, że przynajmniej jeden gracz jest żywy.
Wywołanie nagrody
Dodajemy także forward execute_prize, który zostanie wywołany w momencie wylosowania
nagrody przez jakiegoś gracza i przyjmie jako jedyny argument jego numer identyfikacyjny (1-32).
Forward wykonywany jest tylko dla żywych graczy, więc sprawdzanie, czy gracz żyje, jest zbędne.
/*
Executes prize by given player
id - number of player wchich drew the prize
*/
forward execute_prize(id);
Zmiana mocy nagrody
Za pomocą natywu change_prize_power możemy zmienić moc nagrody dla danego gracza.
/*
Forces prize power change
id - number of player, which power is changed
if set to 0, power is changed for all players
pwr - new power to set
Returns old player`s prize power or -1 if id is 0
*/
native change_prize_power(id=0, pwr=0);
Opcja ta jest przydatna do ograniczenia gry w ruletkę dla poszczególnego gracza oraz
do manipulacji mocą w przypadku określonych czynności, bądź implementacji systemu
zmniejszającego szanse po każdorazowym wylosowaniu, czy blokowaniu nagrody dla
graczy po określonych wydarzeniach, odciążając nagrodę z losowania właściwego.
Zmiana karmy gracza
Nieraz dokładna karma nagrody będzie możliwa do określenia dopiero po wykonaniu pewnych operacji,
np. wylosowania ilości dodawanego życia. Wówczas warto skorzystać z natywu, dodającego karmę graczowi.
Istotne jest jednak, by początkowa wartość karmy była dodatnia dla pozytywnych nagród bądź ujemna dla negatywnych.
/*
Sets user karma level
id - number of player to set new karma
if set to 0, karma is set to all players
karma - new karma to set
Returns old player`s karma or -1 if id is 0
*/
native set_user_karma(id=0, karma=0);
/*
Gets user karma level
id - number of player to get karma
*/
native get_user_karma(id);
Zmiana karmy nagrody
Można zmienić także domyślną karmę dla nagrody:
/*
Changes prize`s karma
karma - new karma to set
Returns prize`s old karma
*/
native change_prize_karma(karma=0);
Czas do końca rundy
Przydatny natyw, zwracający liczbę sekund do końca rundy.
Zastosowanie głównie przy dobieraniu warunku dostępności nagrody.
/*
Gets time to end of round in seconds
*/
native timeleft();
Multilang
Ruletka jest pluginem w pełni wielojęzycznym.
Zaimplementowana została własna struktura słowników drzewiastych.
/*
Registers new dictionary of keys to translate
file - dictionary`s filename placed in data/lang
*/
native register_translate(file[128]);
/*
Translates key registered by register_translate
id - number of player to translate key for
key - the key to translate
result - the output for translated key
*/
native translate(id, key[128], result[896]);
Wszelkie argumenty tłumaczenia kluczy dotyczą tego właśnie słownika drzewiastego.
Proste informacje
W celu prostego informowania gracza, oraz jego widzów o wylosowanej nagrodzie
i jej przebiegu, stworzony został natyw prize_info, który przyjmuje masę argumentów:
/*
Shows information of drawed message to winner and his spectators
id - number of player to show the information
color - color of the message to show.
Available colors to choose:
YELLOW, GREEN, RED, BLUE
key - translates key if set to true or just shows given message
msg - message to show for a player. Limit of 190 characters
msgSpec - message to show for player`s spectators. Same limit.
channel - binary sum of channels message to show
1 - ColorChat
2 - Tutor
4 - Center
time - how long the tutor message have to lasts (float value)
*/
native prize_info(id, color=INFO_YELLOW, msg[190]="", msgSpec[190]="", bool:key=true, channel=3, Float:time=10.0);
enum(<<=1){ // Message channels used in prize_info native
MSG_COLORCHAT=1,
MSG_TUTOR,
MSG_CENTER
}
enum{ // Colors are projected to be compatible with ColorChat
INFO_YELLOW=1, // Yellow color has been added to make names more sense
INFO_GREEN,
INFO_RED=5,
INFO_BLUE
}
Proste odliczanie
Nie tylko informacje na sayu / tutorze są przydatne.
Gotowy jest też natyw do prostego odliczania:
/*
Shows counter centered information to winner and his spectators
Uses client_print print_center in format: "translated_key: number"
id - number of player to show the counter
key - the key to translate, being the prize name
number - number to show (f.e. seconds left, HP left, etc.)
spect - specifies, if show counter to spectators too.
*/
native prize_counter(id, key[128], number, bool:spect=true);
Szablon nagrody
#include <amxmodx>
#include <roulette>
public plugin_init(){
register_plugin("Roulette Prize name", "0.1", "Prize Author");
register_prize("Prize name: Short prize description");
}
public execute_prize(id){
}
public check_prize(id){
return ROULETTE_ALLOW;
}
public power_reset(id){
return ROULETTE_ALLOW;
}
Flaga FCVAR_SHOWALL
W celu prostszej rejestracji cvarów o flagach z odnotowywanymi zmianami, dodana została definicja:
// defines cvar bitsum value, showing cvar`s existing and every change
#define FCVAR_SHOWALL FCVAR_ARCHIVE|FCVAR_SERVER
Limitacja miękka globalna
Standardowo, plugin ruletki, ogranicza losowanie tej samej nagrody
dla jednego gracza w bliskim odstępie losowań, domyślnie ta sama
nagroda może wystąpić dopiero po wylosowaniu 20 innych nagród.
Wyjątkiem jest przypadek, gdy żadna nagroda nie jest dostępna do
wylosowania. Wtedy dochodzi do próby zresetowania mocy nagród.
Szablon kodu do miękkiej limitacji globalnej na liczbę rund ustawianą
cvarem roulette_prize_name_rounds_ban o domyślnej wartości 20.
#include <amxmodx>
#include <roulette>
new ban=0, c_rounds_ban;
public plugin_init(){
register_plugin("Roulette Prize name", "0.1", "Prize Author");
register_prize("Prize name: Short prize description");
register_logevent("roundStart", 2, "1=Round_Start");
c_rounds_ban=register_cvar("roulette_prize_name_rounds_ban", "20", FCVAR_SHOWALL);
}
public execute_prize(id){
change_prize_power(id, 0);
ban=get_pcvar_num(c_rounds_ban);
}
public roundStart(){
if(ban){
--ban;
}
}
public check_prize(id){
return ban?ROULETTE_BLOCK:ROULETTE_ALLOW;
}
public power_reset(id){
return ROULETTE_ALLOW;
}
Limitacja twarda globalna
Limitacja twarda różnić się będzie tym, że wymuszenie resetu mocy nagrody będzie
blokowane poprzez zwrócenie ROULETTE_BLOCK w wywołaniu forwardu power_reset.
enum{
ROULETTE_BLOCK, // Blocks forward execute or disallow for executing
ROULETTE_ALLOW // Executes the forward or allow for executing
}
W podobny sposób można zmienić domyślną liczbę limitacji dla poszczególnych użytkowników.
Tworzenie funkcji czasowej
#include <amxmodx>Stworzyliśmy zmienną globalną prize[33], przechowującą licznik czasu dla poszczególnych graczy.
#include <hamsandwich>
#include <roulette>
new maxPlayers, prize[33];
public plugin_init(){
register_plugin("Roulette Prize name", "0.1", "Prize Author");
register_prize("Prize name: Short prize description");
register_logevent("roundEnd", 2, "1=Round_End");
register_logevent("roundEnd", 2, "1=Game_Commencing");
RegisterHam(Ham_Killed, "player", "killed", 1);
}
public plugin_cfg(){
maxPlayers=get_maxplayers();
}
public execute_prize(id){
prize[id]=20;
new data[1];
data[0]=id;
set_task(1.0, "timer", _, data, 1, "a", prize[id]);
}
public timer(data[]){
new id=data[0];
if(is_user_alive(id) && prize[id]){
if(--prize[id]){
// tutaj wykonujemy kod co sekunde, dla dodatniego licznika czasu
} else {
// licznik czasu wlasnie dobiegl zera, wykonujemy pewien, inny kod
}
}
}
public killed(vid, kid, shouldgib){
if(prize[vid]){
prize[vid]=0;
}
}
public client_putinserver(id){
prize[id]=0;
}
public roundEnd(){
remove_task();
for(new i=1; i<=maxPlayers; ++i){
prize[i]=0;
}
}
public check_prize(id){
return ROULETTE_ALLOW;
}
public power_reset(id){
return ROULETTE_ALLOW;
}
Licznik przyjmie pewną wartość, gdy gracz wylosuje nagrodę (execute_prize) i stworzymy taska dla tego
gracza, który będzie wykonywać się co sekundę. W przykładzie ustawiono czas na 20 sekund.
Następnie, co sekundę wywoływana będzie funkcja timer, w której to już musimy sprawdzić, czy gracz żyje
oraz posiada timer, czyli ma nagrodę aktywną. Tu też zmniejszamy czas i wykonujemy odpowiedni kod.
Koniec nagrody może nastąpić standardowo na 3 sposoby:
- Koniec czasu (licznik osiągnął wartość zerową)
- Zabicie gracza (stąd funkcja killed)
- Koniec rundy (funkcja roundEnd)
Należy pamiętać, by uwzględnić wszystkie wymienione możliwości skończenia się czasu.
Po skończonym czasie możemy też bez problemu wywołać funkcję, przywracającą gracza
do normalności, jeśli wykonywaliśmy na nim zaawansowane operacje, np. oddać mu nóż.
Funkcja czasowa z licznikiem
Dodamy teraz funkcjonalny licznik do naszej funkcji czasowej, czyli baza praktyczna.
Skorzystamy także z czasu losowanego, ograniczanego wartościami dwóch cvarów.
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <roulette>
new maxPlayers, prize[33];
new c_prize_min, c_prize_max;
public plugin_init(){
register_plugin("Roulette Prize name", "0.1", "Prize Author");
register_prize("Prize name: Short prize description");
register_logevent("roundEnd", 2, "1=Round_End");
register_logevent("roundEnd", 2, "1=Game_Commencing");
RegisterHam(Ham_Killed, "player", "killed", 1);
c_prize_min=register_cvar("c_prize_name_min", "10", FCVAR_SHOWALL);
c_prize_max=register_cvar("c_prize_name_max", "20", FCVAR_SHOWALL);
}
public plugin_cfg(){
maxPlayers=get_maxplayers();
}
public execute_prize(id){
// gracz o numerze id wylosowal nagrode
// tutaj wykonujemy operacje tuz po wylosowaniu nagrody
prize[id]=random_num(get_pcvar_num(c_prize_min), get_pcvar_num(c_prize_max));
prize_info(id, INFO_BLUE, "PRIZE_NAME_DESC", "PRIZE_NAME_DESC_SPEC");
prize_counter(id, "PRIZE_NAME", prize[id]);
new data[1];
data[0]=id;
set_task(1.0, "timer", _, data, 1, "a", prize[id]);
}
public timer(data[]){
new id=data[0];
if(is_user_alive(id) && prize[id]){
if(--prize[id]){
// tutaj wykonujemy kod co sekunde, dla dodatniego licznika czasu
prize_counter(id, "PRIZE_NAME", prize[id]);
} else {
// licznik czasu wlasnie dobiegl zera, wykonujemy pewien, inny kod
prize_info(id, .key=false, .channel=MSG_CENTER);
}
}
}
public killed(vid, kid, shouldgib){
if(prize[vid]){
prize[vid]=0;
}
}
public client_putinserver(id){
prize[id]=0;
}
public roundEnd(){
remove_task();
for(new i=1; i<=maxPlayers; ++i){
prize[i]=0;
}
}
public check_prize(id){
return ROULETTE_ALLOW;
}
public power_reset(id){
return ROULETTE_ALLOW;
}
W momencie wygrania nagrody, wypisujemy dla gracza oraz wszystkich, którzy go obserwują,
informację o nagrodzie zarówno na sayu, jak i w Tutorze. Do tego wyświetlany jest licznik czasu
na środku ekranu. W przykładzie zastosowano kolory czerwone, oznaczające zazwyczaj złą nagrodę,
jednak inwencja kolorystyki pozostaje wolą autora danej nagrody, choć zaleca się używanie kolorów
zielonych wobec dobrej nagrody, czerwonych wobec złej, niebieskich wobec neutralnych / informacji.
W ruletce wykorzystywany jest tutor, tak więc konieczne jest, by został on pobrany i był umieszczony na serwerze.
Skopiuj po prostu zawartość archiwum tutor.rar do katalogu cstrike na serwerze, a plik tutor.inc
do folderu scripting/include, by móc kompilować takie pluginy. Oficjalny temat o Tutorze na forum.
tutor.rar 7,34 KB 174 Ilość pobrań
tutor.inc 2,21 KB 163 Ilość pobrań
Tutor będzie działał poprawnie u graczy dopiero za drugim wejściem na serwer, będzie działał zarówno
u graczy CS CZ, jak i CS 1.6. Funkcje tutorPrecache oraz tutorInit są konieczne do działania tutora.
Poza tutorem, w wielu nagrodach wykorzystywany jest także stock StripWeapons,
który pozwala na pozbawienie gracza wybranej broni, bądź typu broni.
stripweapons.inc 4 KB 153 Ilość pobrań
Limit miękki gracza
Po otrzymaniu nagrody, wywołujemy na graczu
change_prize_power(id, 0);
Dzięki temu, gracz nie wylosuje nagrody
aż do końca mapy lub resetu mocy nagród.
Changelog
24.12.2012 1.0 N Init version
28.12.2012 2.0 + Added custom configuration files. Plugin is fully plug & play now
03.01.2013 2.1 $ Fixed incorrect plugin native change prize power call
04.01.2013 2.2 + Added cutom map`s custom configuration files settings service
08.01.2013 3.0 % Improved memory usage, replacing stable tables with the cellarray
11.01.2013 3.1 $ Fixed the ArrayGetArray incorect identifier usage
13.01.2013 4.0 + Added multilanguage service, changed main plugin language to english
13.01.2013 4.0.1 $ Changed variables names and comments to english
13.01.2013 4.0.2 $ Fixed null sized array initialize while no prizes
13.01.2013 4.1 % Improved menu show while no prizes
13.01.2013 4.2 $ No more searching for winning prize`s execute forward id twice
28.01.2013 5.0 % Merged ConnorMcLeod`s get_remaining_seconds and Roulette
28.01.2013 5.0.1 + Added timeleft native
29.01.2013 5.1 + Added register_translate and translate natives
30.01.2013 5.1.1 $ Fixed translations for tutor
30.01.2013 5.2 + Added prize_info native
30.01.2013 5.3 $ Added register_prize multilang support
30.01.2013 5.3.1 % Improved some comparisons usage
30.01.2013 5.3.2 $ Fixed infinity loop bug when prize`s default power is 0
01.02.2013 6.0 + Added karma system
02.02.2013 6.0.1 % Improved some natives returns
02.02.2013 6.1 + Added change_prize_karma, set_user_karma and get_user_karma natives
03.02.2013 6.1.1 % Improved some natives parameters and variables usage
03.02.2013 6.1.2 + Added source code sections and some comments blocks
04.02.2013 6.1.3 + Added KARMA_* defines in INC file
04.02.2013 6.1.4 + Added POWER_STR, allowing use it directly in prize`s power cvars
04.02.2013 6.2 % Reduced POWER(_STR) to 7! to avoid integer overflow more effectively
04.02.2013 6.2.1 + Added FCVAR_SHOWALL definition to simplify registering some cvars
05.02.2013 6.2.2 $ Fixed translate native not returning translated string
05.02.2013 6.2.3 + Added credits informations in info section of SMA file
05.02.2013 6.3 + Added prize_counter native to simplify showing counters
06.02.2013 6.3.1 % Moved descriptions in INC file over the content to cooperate with editors
05.03.2013 6.3.2 % Changed array of booleand into bitsum, added bitsum defines
#398189 Slowmo
Napisane przez DarkGL w 16.04.2012 23:43
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
amx_slowmo 0.3 // wartość spowolnienia przy ustawieniu 0.1 gracz poruszał by się 10x wolniej itp.
http://www.youtube.com/watch?v=MEOqfrCHUwI
http://www.youtube.com/watch?v=HXTi7gih7UU
slowmo.sma 2,75 KB 429 Ilość pobrań
slowmo.amxx
#392912 Komunikator
Napisane przez Gość w 07.04.2012 05:51
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]
- 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).
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 ""
- 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)
amxmodx
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.
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
Licencja: PAL (Uznanie autorstwa)
Wersja: 1.0.7
Język: Polski
Wersja 1.07 (najnowsza)
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
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
Dokumentacja AMXX.pl: Core >> string > num_to_strCzy jest możliwe zmiana zmiennej int w string?
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 > addI czy do zmiennej string można dodać int?
#269435 Call of duty: Sprint effect (Klawisz shift)
Napisane przez diablix w 13.07.2011 18:06
by diablix
Wiele ludzi poszukiwało tego pluginu, więc jedziemy:)
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.
Zamieszczam prezentację
http://www.youtube.com/watch?v=i8N7QAMLoyw
- Fakemeta
W najbliższym czasie zostanie ukazana wersja DarkGL'a i zostanie ona podpięta w tym temacie
Załączone pliki
-
sprint.sma 4,08 KB 1012 Ilość pobrań
sprint.amxx -
sprint.amxx 5,92 KB 119 Ilość pobrań
#369879 MoneyApi Api do zarządzania pieniędzmi
Napisane przez G[o]Q w 23.02.2012 23:31
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
-
money.inc 1,67 KB 78 Ilość pobrań
-
money_api.sma 1,84 KB 68 Ilość pobrań
money_api.amxx
#9646 Eventy
Napisane przez Miczu w 02.07.2008 15:13
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
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_logeventnie 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
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!
#27095 set_task - funkcje czasowe
Napisane przez Miczu w 09.12.2008 11:08
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
- AMXX.pl: Support AMX Mod X i SourceMod
- → Przeglądanie profilu: Reputacja: Harsay
- Regulamin