[URL] https://amxx.pl/topic/101012-ruletka/
**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
![[Image: smile.png]](https://amxx.pl/public/style_emoticons/default/smile.png)
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.
![[Image: opis.png]](http://amxx.pl/foty/grafikap/opis.png)
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.
![[Image: ss.png]](http://amxx.pl/foty/grafikap/ss.png)
[
![[Image: post-21977-0-04274900-1356485014_thumb.jpg]](https://amxx.pl/uploads/monthly_12_2012/post-21977-0-04274900-1356485014_thumb.jpg)
"2012-12-25_00009.jpg - Rozmiar: 123,17 KB")
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
![[Image: cvary.png]](http://amxx.pl/foty/grafikap/cvary.png)
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
![[Image: wymaganemoduly.png]](http://amxx.pl/foty/grafikap/wymaganemoduly.png)
amxmodx
amxmisc
celltrie
colorchat
cstrike
fakemeta
hamsandwich
tutor
![[Image: inneinformacje.png]](http://amxx.pl/foty/grafikap/inneinformacje.png)
**Autor** : Paweł "benio101" Benetkiewicz
**Licencja** : [url=http://bineo.biz/licencje/PAL "Zewnętrzny odnośnik"]PAL[/url]
![[Image: download.png]](http://amxx.pl/foty/grafikap/download.png)
[
[**roulette.rar**](https://amxx.pl/index.php?app=core&modul...h_id=51980
"Pobierz załącznik") **1,65 MB** 841 Ilość pobrań
Opcjonalne pliki do wstawienia na fastDL
[
[**fastDL.rar**](https://amxx.pl/index.php?app=core&modul...h_id=50795
"Pobierz załącznik") **1,12 MB** 392 Ilość pobrań
![[Image: instalacja.png]](http://amxx.pl/foty/grafikap/instalacja.png)
**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ą.
[
![[Image: post-21977-0-83136000-1356353965_thumb.png]](https://amxx.pl/uploads/monthly_12_2012/post-21977-0-83136000-1356353965_thumb.png)
"Ruletka.WinSCP.png - Rozmiar: 233,71 KB")
**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](https://amxx.pl/index.php?showtopic=107674), rozwiąże ten problem.
Grawitacja nie będzie się resetowała po użyciu spadochronu, a spadochron
graczy niewidzialnych także będzie niewidzialny.
![[Image: komendy.png]](http://amxx.pl/foty/grafikap/komendy.png)
Poniżej przedstawiam opis dla programistów, którzy chcieliby edytować /
tworzyć własne nagrody.
Informacje deweloperskie:
Spoiler
**Główne pliki ruletki**
[
[**roulette.sma**](https://amxx.pl/index.php?app=core&modul...h_id=51979
"Pobierz załącznik") **24,56 KB** 237 Ilość pobrań
[
![[Image: amxx.gif]](http://amxx.pl/public/style_extra/mime_types/amxx.gif)
"Pobierz plik AMXX")
[
[**roulette.inc**](https://amxx.pl/index.php?app=core&modul...h_id=50760
"Pobierz załącznik") **4,52 KB** 231 Ilość pobrań
**Dokumentacja Ruletki**
**Tworzenie nowej nagrody**
W funkcji
[plugin_init
![[Image: favicons.png]](https://amxx.pl/favicons.png)
init "Dokumentacja AMXX.pl: Core >> amxmodx > plugin_init") (nie później!)
rejestrujemy nową nagrodę przy użyciu natywu
[register_prize
![[Image: favicons.png]](https://amxx.pl/favicons.png)
prize "Dokumentacja AMXX.pl: 3rdParty >> roulette > 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
![[Image: favicons.png]](https://amxx.pl/favicons.png)
prize "Dokumentacja AMXX.pl: 3rdParty >> roulette > 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{
ROULETTE_BLOCK, // Blocks forward execute or disallow for executing
ROULETTE_ALLOW // Executes the forward or allow for executing
}
Jeśli chcemy, by nagroda była zawsze dostępna, wpisujemy proste
public check_prize(id){
return ROULETTE_ALLOW;
}
Możemy jednak ograniczyć nagrodę, np. tylko dla terrorystów:
public check_prize(id){
return get_user_team(id)==1?ROULETTE_ALLOW:ROULETTE_BLOCK;
}
Forward może zostać wykonany w momencie zagrania przez któregoś
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
![[Image: favicons.png]](https://amxx.pl/favicons.png)
reset "Dokumentacja AMXX.pl: 3rdParty >> roulette > 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
![[Image: favicons.png]](https://amxx.pl/favicons.png)
prize "Dokumentacja AMXX.pl: 3rdParty >> roulette > check_prize"), można
założyć, że przynajmniej jeden gracz jest żywy.
**Wywołanie nagrody**
Dodajemy także forward
[execute_prize
![[Image: favicons.png]](https://amxx.pl/favicons.png)
prize "Dokumentacja AMXX.pl: 3rdParty >> roulette > 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
![[Image: favicons.png]](https://amxx.pl/favicons.png)
prize-power "Dokumentacja AMXX.pl: 3rdParty >> roulette > 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
![[Image: favicons.png]](https://amxx.pl/favicons.png)
info "Dokumentacja AMXX.pl: 3rdParty >> roulette > 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
![[Image: favicons.png]](https://amxx.pl/favicons.png)
reset "Dokumentacja AMXX.pl: 3rdParty >> roulette > 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>
#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;
}
Stworzyliśmy zmienną globalną prize[33], przechowującą licznik czasu dla
poszczególnych graczy.
Licznik przyjmie pewną wartość, gdy gracz wylosuje nagrodę
([execute_prize
![[Image: favicons.png]](https://amxx.pl/favicons.png)
prize "Dokumentacja AMXX.pl: 3rdParty >> roulette > 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)
W funkcji roundEnd dodamy także instrukcję, która usuwa wszelkie ewentualne
zadania.
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](http://amxx.pl/topic/57554-tutor-informacje-jak-w-
condition-zero/).
[
[**tutor.rar**](https://amxx.pl/index.php?app=core&modul...h_id=47861
"Pobierz załącznik") **7,34 KB** 208 Ilość pobrań
[
[**tutor.inc**](https://amxx.pl/index.php?app=core&modul...h_id=47862
"Pobierz załącznik") **2,21 KB** 192 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**](https://amxx.pl/index.php?app=core&modul...h_id=50768
"Pobierz załącznik") **4 KB** 188 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**
Spoiler
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
Załączniki:
fastDL.rar
roulette.inc
roulette.rar
roulette.sma
stripweapons.inc
tutor.inc
tutor.rar