←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

Dzialac dziala, ale nie poprawnie. Bledzik...

  • +
  • -
MalySzkrab3k's Photo 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?


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.
Quote

  • +
  • -
GwynBleidD's Photo 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...

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...
Quote