←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Crash po 15 sek przy otrzymaniu broni

  • +
  • -
Andrzejek - zdjęcie Andrzejek 13.05.2013

Siemka, mam problem, ponieważ gdy włączam public daj_bron() i zaczyna odliczanie kiedy ma dać broń dla tt to po 15 sek jest crash serwera, jak to naprawić?

 

#define MAX 32
#define TASK_HUD 6781252

//

public daj_bron()
{                
    for(new gracz=1; gracz<=MAX; gracz++)
    {
        if(is_user_alive(gracz) && is_user_connected(gracz))
        {
            if(get_user_team(gracz) == 1)
            {                
                set_task(15.0, "DajBRON", TASK_HUD)
                
            }
            else if(get_user_team(gracz) == 2)
            {        
                //
            }
        }
    }

}

public DajBRON()
{          
    for(new gracz=1; gracz<=MAX; gracz++)
    {
        if(is_user_connected(gracz) && get_user_team(gracz) == 1 && is_user_alive(gracz))
        {            
            player_strip_weapons(gracz);
            give_item(gracz, "weapon_ak47");
            cs_set_user_bpammo(gracz, CSW_AK47, 90);
                        
            give_item(gracz, "weapon_hegrenade")
            give_item(gracz, "weapon_flashbang")
        }
    }
}

 

 

Odpowiedz

  • +
  • -
K!113r - zdjęcie K!113r 13.05.2013

Dlaczego wywołujesz tyle tasków ile jest żywych tt? Być może taski z tym samym id nakładając się powodują crash (ja tak miałem), więc albo dla każdego wywołuj task z osobnym podaniem broni lub po prostu wywołaj jak teraz taska z czasem 15.0 (jeżeli choć jeden tt jest żywy) i w funkcji tasku w pętli sprawdzaj czy gracz żyje i daj mu broń, gdyż tak wywołujesz kilka-kilkanaście tasków o tym samym id, jeżeli dalej nie wiesz o czym pisze przeanalizuj sobie swoją pętle.

Odpowiedz

  • +
  • -
Droso - zdjęcie Droso 13.05.2013

#define MAX 32
#define TASK_HUD 6781252
 
 
public daj_bron()
{                
set_task(15.0, "DajBRON", TASK_HUD)  // tylko jeden task
 
for(new gracz=1; gracz<=MAX; gracz++)
{
if(is_user_alive(gracz))
{
if(get_user_team(gracz) == 2)
{        
// twoj kodzik dla CT
}
}
}
}
 
public DajBRON()
{          
for(new gracz=1; gracz<=MAX; gracz++)
{
if(is_user_alive(gracz) && get_user_team(gracz) == 1)
{            
player_strip_weapons(gracz);
give_item(gracz, "weapon_ak47");
cs_set_user_bpammo(gracz, CSW_AK47, 90);
 
give_item(gracz, "weapon_hegrenade")
give_item(gracz, "weapon_flashbang")
}
}
}
 

Możliwe też, że player_strip_weapons(gracz); ma jakiś błąd w sobie, a tego nie widzimy

Odpowiedz

  • +
  • -
radim - zdjęcie radim 13.05.2013

#define MAX 32
 
public daj_bron()
{                         
set_task(15.0, "DajBRON")
}
public DajBRON()
{
for(new gracz=1; gracz<=MAX; gracz++)
{
if(is_user_alive(gracz) && get_user_team(gracz) == 1)
{            
player_strip_weapons(gracz);
give_item(gracz, "weapon_ak47");
cs_set_user_bpammo(gracz, CSW_AK47, 90);
 
give_item(gracz, "weapon_hegrenade")
give_item(gracz, "weapon_flashbang")
}
}
}
Uproszczony kod. Następnym razem nie sprawdzaj jednocześnie czy gracz jest połączony i żywy gdyż logiczne jest to, że gdy gracz jest żywy to i musi być połączony O.o Jeżeli będzie nadal błąd, to podaj logi.
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 13.05.2013

Wywołanie bardzo szybko dużo razy give_item jest bardzo dobrym sposobem na crashowanie serwera. Jak masz amx_super zainstalowane (lub sam plugin na bronie, ale z możliwością dania komuś wszystkich pod kodem 200) to wpisz w konsoli amx_weapon @all 200 i patrz na fajerwerki :)

Odpowiedz

  • +
  • -
Andrzejek - zdjęcie Andrzejek 14.05.2013

A mogę zrobićtak że dodam to w odliczaniu? I zrobię tak np.

 

if(odliczanie <= 15)
{
    DajBRON();
}

Odpowiedz

  • +
  • -
radim - zdjęcie radim 14.05.2013

No dobra a jaki jest tego cel ? Bo nie do końca rozumiem do czego zmierzasz.

Odpowiedz

  • +
  • -
Andrzejek - zdjęcie Andrzejek 14.05.2013

Mam zabawę KillDay i nie chce że po włączeniu tej zabawy od razu daje wszystkim broń tylko po tych np. 15 sek. Nie chce żadnych gotowców z neta, bo chce się też czegoś nauczyć, proste.

Odpowiedz

  • +
  • -
radim - zdjęcie radim 14.05.2013

A mogę zrobićtak że dodam to w odliczaniu? I zrobię tak np.

 

if(odliczanie <= 15)
{
    DajBRON();
}

Chodzi mi dokładnie o to, bo nie wiem co chcesz dzięki temu uzyskać, jaki jest cel Twego dążenią.

Odpowiedz

  • +
  • -
Andrzejek - zdjęcie Andrzejek 14.05.2013

Sory pomyliłem się tu powinno być:

if(odliczanie == 15)
{
    DajBRON();
}



Jeżeli czas odliczania powiedzmy od 30 sek, wynosi 15 sek to daje broń

 

Odpowiedz

  • +
  • -
radim - zdjęcie radim 14.05.2013

Czym się będzie różnić ten Twój kod od powyższych ? Pomijając fakt, że Twoja metoda byłaby wolniejsza ? Sprawdzałeś powyższe kody ? Działają ? Jeżeli nadal występują crashe to zapodaj logi/errory, bo mogą być. Ale spoglądając na kod, powinno działać.

Odpowiedz

  • +
  • -
Andrzejek - zdjęcie Andrzejek 14.05.2013

Okej sprawdzę to co napisaliście UP. A co do logów to ich nie ma :(

Odpowiedz