Dzialac dziala, ale nie poprawnie. Bledzik...
MalySzkrab3k
25.12.2012
Witam, jest to kawałek z mojego pluginu który wywołuje napisana wcześniej pętla, a mianowicie chodzi o to, ze gdy zostaje 2 terrorystów nie zabiera broni obydwom więźnia, zabiera tylko jednemu. Co robię złe ? Co jest nie tak?
Edited by MalySzkrab3k, 25.12.2012 18:21.
public Sprawdz2()
{
if(terro_alive == 2)
{
for(new i=2; i<=maxpl; i++)
{
if(is_user_alive(i) && is_user_connected(i) && get_user_team(i) == 1)
{
if(task_exists(999)) remove_task(999);
set_user_maxspeed(i, 250.0);
set_user_health(i, 50);
strip_user_weapons(i);
give_item(i, "weapon_knife");
return FMRES_HANDLED;
}
}
}
return PLUGIN_HANDLED;
}
Edited by MalySzkrab3k, 25.12.2012 18:21.
GwynBleidD
25.12.2012
Po pierwsze, wbij sobie na zawsze do głowy jeśli chcesz pisać pluginy, czy programować w jakimkolwiek innym języku programowania 2 zasady:/
1. WCIĘCIA W KODZIE - to podstawa podstaw! Poprawia znacząco czytelność kodu, nie tylko Tobie jako autorowi, ale też innym, do których się zwracasz o pomoc.
2. CZYTELNOŚĆ KODU - zawsze dbaj o to, żeby kod był czytelny i zrozumiały, opatrzony komentarzami w odpowiednich miejscach...
A teraz do rzeczy. Widzę skleiłeś 2 pluginy ze sobą, nie do końca rozumiejąc chyba co robisz...
Co tu robi ta dwójka? Widzę, że nie do końca rozumiesz jak działają pętle. Tą dwójką spowodowałeś, że gracze będą sprawdzani począwszy od tego z id=2, czyli jeden zostanie pominięty (z id=1).
Ta linia powinna być poza pętlą, ABSOLUTNIE! Po co dla każdego terrorysty ten task usuwać?
Tu właśnie leży główny problem... return powoduje wyjście z aktualnie wykonywanej funkcji, zwracając to co po słówku return stoi. Czyli w tym przypadku szukasz terrorysty, zaczynając od id=2, gdy go znajdziesz to zabierasz mu wszystko, dajesz nóż i sobie z funkcji wychodzisz, więc następnego terrorysty raczej ta funkcja nie znajdzie, nie sądzisz? Wystarczy usunąć tą linię i będzie OK.
Poza tym takie pytanie, gdzie Ty wykonujesz tą funkcję? Co ją wywołuje? Bo z jednego returna wynika, że fakemeta, a z drugiego że to zwykły event z AMX...
1. WCIĘCIA W KODZIE - to podstawa podstaw! Poprawia znacząco czytelność kodu, nie tylko Tobie jako autorowi, ale też innym, do których się zwracasz o pomoc.
2. CZYTELNOŚĆ KODU - zawsze dbaj o to, żeby kod był czytelny i zrozumiały, opatrzony komentarzami w odpowiednich miejscach...
A teraz do rzeczy. Widzę skleiłeś 2 pluginy ze sobą, nie do końca rozumiejąc chyba co robisz...
for(new i=2; i<=maxpl; i++)
Co tu robi ta dwójka? Widzę, że nie do końca rozumiesz jak działają pętle. Tą dwójką spowodowałeś, że gracze będą sprawdzani począwszy od tego z id=2, czyli jeden zostanie pominięty (z id=1).
if(task_exists(999)) remove_task(999);
Ta linia powinna być poza pętlą, ABSOLUTNIE! Po co dla każdego terrorysty ten task usuwać?
return FMRES_HANDLED;
Tu właśnie leży główny problem... return powoduje wyjście z aktualnie wykonywanej funkcji, zwracając to co po słówku return stoi. Czyli w tym przypadku szukasz terrorysty, zaczynając od id=2, gdy go znajdziesz to zabierasz mu wszystko, dajesz nóż i sobie z funkcji wychodzisz, więc następnego terrorysty raczej ta funkcja nie znajdzie, nie sądzisz? Wystarczy usunąć tą linię i będzie OK.
Poza tym takie pytanie, gdzie Ty wykonujesz tą funkcję? Co ją wywołuje? Bo z jednego returna wynika, że fakemeta, a z drugiego że to zwykły event z AMX...