#include <amxmodx>
#include <fun>
#include <HamSandwich>
// makrodefinicje obsługi Sumy bitów
#define SetBit(%1,%2) (%1|=(1<<(%2)))
#define ClearBit(%1,%2) (%1&=~(1<<(%2)))
#define CheckBit(%1,%2) (%1&(1<<(%2)))
// zmienna jako suma bitów, określająca, czy gracz ma bonus prędkości
new speedbuff;
// zmienna z maksymalną liczbą graczy na serwerze
new maxPlayers;
public plugin_init(){
// Rejestruje plugin
register_plugin("Random speed buff", "1.0", "benio101");
// Rejestruje najlepszy dostępny event resetu prędkości gracza
RegisterHam(get_player_resetmaxspeed_func(), "player", "speed", 1);
// Rejestruje event nowej rundy
register_logevent("roundStart", 2, "1=Round_Start");
// Rejestruje event końca rundy
register_logevent("roundEnd", 2, "1=Round_End");
}
public plugin_cfg(){
//pobiera maksymalną liczbę graczy na serwerze
maxPlayers=get_maxplayers();
}
// Wybiera najlepszy dostępny event resetu prędkości gracza
Ham:get_player_resetmaxspeed_func(){
#if defined Ham_CS_Player_ResetMaxSpeed
return IsHamValid(Ham_CS_Player_ResetMaxSpeed)?Ham_CS_Player_ResetMaxSpeed:Ham_Item_PreFrame;
#else
return Ham_Item_PreFrame;
#endif
}
// obsługa nowej rundy
public roundStart(){
// pobieranie id żywych graczy
new player_ids[32], players=-1;
for(new i=1; i<=maxPlayers; ++i){
if(is_user_alive(i)){
player_ids[++players]=i;
}
}
if(++players){
// losujemy zwycięzcę speed buffa
new winner=player_ids[random(players)];
// dodajemy jej buffa prędkości w miejscu
set_user_maxspeed(winner, 1000.0);
// oznaczamy gracza jako posiadającego buffa
SetBit(speedbuff, winner);
}/*{
else brak żywych graczy, nie losujemy
}*/
}
// obsługa bonusu prędkości
public speed(id){
if(
// sprawdzamy, czy gracz żyje
is_user_alive(id)
// oraz, czy posiada buff prędkości
&& CheckBit(speedbuff, id)
){
// jeśli posiada, to ustawiamy mu prędkość znów na 1000.0
set_user_maxspeed(id, 1000.0);
}
}
public client_connect(id){
// zapobiegamy odziedziczeniu buffa przez nowego gracza,
// który otrzymał id szczęśliwca, który opuścił serwer
ClearBit(speedbuff, id);
}
public roundEnd(){
// runda się skończyła, usuwamy wszelkie bonusy prędkości
speedbuff=0;
}