Ad.2. Funkcja task, poza nazwą funkcji do wykonania, wartością czasu i flagami, może przyjąć numer zadania.
Należy uważać, żeby nie stworzyć zadania o numerze innego, już istniejącego.
Numer zadania(opcjonalny 3. parametr funkcji) musi być unikalny ze względów technicznych pawna.
Wiele osób korzystało z tworzenia taska z identyfikatorem równym id gracza.
Szybko odeszli od tego fatalnego pomysłu, tworząc równie złe rozwiązanie, do numeru gracza dodawali pewną, unikalną liczbę,
następnie odejmując ją w momencie wykonywania zadania. Niestety, liczby te, o ile nie są oddalone o minimum maksymalną możliwą liczbę graczy na serwerze,
to mogą prowadzić do nieprzewidzianych skutków, ingerując w taski z innej funkcji, a następnie próbując dwukrotnie dodać, bądź odjąć zadanie,
co powoduje w nieprzewidzianych momentach, co nieokreślony i trudny do przewidzenia czas, losowe crashe serwera bez error logów.
Wystarczy popatrzeć na dział "Problemy z
AMXX / Problemy z
HLDS". Wiele z tych nierozwiązanych problemów polega na nieudolnym używaniu kodu typu:
#include <amxmodx>
#include <hamsandwich>
#include <fun>
#define TASK_YEAR 2012
#define TASK_FB 1337
#define TASK_HE 1991
#define TASK_SG 1111
public plugin_init(){
register_plugin("Bad task example", "0.1", "benio101");
RegisterHam(Ham_Spawn, "player", "ham_spawn", 1);
set_task(100.0,"gracz_roku",TASK_YEAR);
}
public ham_spawn(id){
if(is_user_alive(id)){
set_task(5.0,"fb",id+TASK_FB,_,_,"b");
set_task(10.0,"he",id+TASK_HE,_,_,"b");
set_task(20.0,"sg",id+TASK_SG,_,_,"b");
}
}
public gracz_roku(){
client_print(0,print_chat,"Graczem roku zostal Haxi0r! Gratulacje!");
}
public fb(id){
id-=TASK_FB;
if(is_user_alive(id)){
give_item(id,"item_flashbang");
} else {
remove_task(id+TASK_FB);
}
}
public he(id){
id-=TASK_HE;
if(is_user_alive(id)){
give_item(id,"item_hegrenade");
} else {
remove_task(id+TASK_HE);
}
}
public sg(id){
id-=TASK_SG;
if(is_user_alive(id)){
give_item(id,"item_smokegrenade");
} else {
remove_task(id+TASK_SG);
}
}
Stąd zalecam wysyłać parametry jako tablicę, wraz z podaniem jej wielkości, by zapobiec niespodziewanym crashom serwera bez errorlogów.
Dokładne informacje, jak przesyłać parametry znajdują się m.in. w
tym dziale.
Jeśli w kodzie powyżej, poza oczywistym brakiem usunięcia tasku w przypadku końca rundy, nie widzisz innych błędów, to oznacza, że jesteś podatny na wyżej opisany przypadek.Ad.1. Do porównania służy funkcja equal
if(equal(nazwa_mapy,"de_dust2"))