Główne pliki ruletki
roulette.sma 24,56 KB 204 Ilość pobrań
roulette.amxx
roulette.inc 4,52 KB 194 Ilość pobrań
Dokumentacja RuletkiTworzenie nowej nagrodyW 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 nagrodyDo 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{
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 mocyDo 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 nagrodyDodajemy 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 nagrodyZa 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 graczaNieraz 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 nagrodyMoż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 rundyPrzydatny 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();
MultilangRuletka 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 informacjeW 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 odliczanieNie 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_SHOWALLW 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 globalnaStandardowo, 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 globalnaLimitacja 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>
#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) 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 licznikiemDodamy 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.incdo folderu
scripting/include, by móc kompilować takie pluginy.
Oficjalny temat o Tutorze na forum.
tutor.rar 7,34 KB 177 Ilość pobrań
tutor.inc 2,21 KB 164 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 155 Ilość pobrań
Limit miękki graczaPo 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.