Skocz do zawartości
VestSmart

[Rozwiązane] Exception reported: Client index -1 is invalid - (Problem z losowym VIP)

Rekomendowane odpowiedzi

Napisano (edytowane)

 

 

 

Witam!
Mam problem z losowym vipem Hanys'a. Po odbyciu się losowania powstaje taki error a gracz nie dostaje vipa.

 

L 05/17/2019 - 20:09:45: [SM] Exception reported: Client index -1 is invalid
L 05/17/2019 - 20:09:45: [SM] Blaming: Losowanie_VIP.smx
L 05/17/2019 - 20:09:45: [SM] Call stack trace:
L 05/17/2019 - 20:09:45: [SM]   [0] AddUserFlags
L 05/17/2019 - 20:09:45: [SM]   [1] Line 47, Losowanie_VIP.sp::Event_RoundStart


Kod vipa:

 

#include <sourcemod>

public Plugin:myinfo =
{
    name = "LosowyVip",
    author = "Hanys",
    description = "Plugin losuje losowa osobe ktora otrzyma flage",
    version = "1.0",
    url = "http://hanys.dispark.pl"
}

new Handle:Random_round;
new Handle:Random_player;
new Rounds = 0;

public OnPluginStart()
{
    CreateConVar("sm_randomvip", "1.0", "Losowy VIP", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);
    
    Random_round = CreateConVar("random_round", "0", "W ktorej rundzie ma losowac losowego vip'a (Uwaga: Rozgrzewka liczona jest jako 1 runda!) 0:Losowy vip wylaczony", FCVAR_NOTIFY);
    Random_player = CreateConVar("random_player", "0", "Ile osob wymaganych jest do wylosowania losowego vip'a", FCVAR_NOTIFY);
    
    
    AutoExecConfig(true, "sm_vip_random");
    
    HookEvent("round_start", Event_RoundStart);
    HookEvent("cs_win_panel_match", RestartRound);
}

public Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
    new winner = GetRandomPlayer(3);
    new g_random_round = GetConVarInt(Random_round);
    
    Rounds = Rounds + 1;
    
    if (Rounds == g_random_round)
    
    {
        if (winner == -1)
        
        {
            
            PrintToChatAll("\x04[\x04Losowanie VIP\x01] \x06Na serwerze znajduje sie za malo graczy do wylosowania losowego VIP'a\x01");
            
        }
        AddUserFlags(winner, Admin_Custom1);
        
        PrintToChatAll("[\x04Losowanie VIP\x01] \x06Trwa losowanie VIP'a...\x01");
        PrintToChatAll("[\x04Losowanie VIP\x01] \x06-----\x01");
        PrintToChatAll("[\x04Losowanie VIP\x01] \x06-----\x01");
        PrintToChatAll("[\x04Losowanie VIP\x01] \x06-----\x01");
        PrintToChatAll("[\x04Losowanie VIP\x01] \x06Losowym VIP'em zostaje \x02%N\x01\x06! Gratulujemy!\x01", winner);
        
    }
}

public Action:RestartRound(Handle:event, const String:name[], bool:dontBroadcast)
{
    Rounds = 0;
}

stock GetRandomPlayer(team)
{
    
    new g_random_player = GetConVarInt(Random_player);
    new clients[MaxClients + 1], clientCount;
    
    for (new i = 1; i <= MaxClients; i++)
    if (IsClientInGame(i) && !IsFakeClient(i) && !GetAdminFlag(GetUserAdmin(i), Admin_Custom1))
    clients[clientCount++] = i;
    
    if (clientCount <= g_random_player)
    return -1;
    
    return clients[GetRandomInt(0, clientCount - 1)];
}

 

 

 

 

 

 

 

 

 

 

 

 

Edytowane przez VestSmart

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Sprawdź czy rozwiązanie, które było tutaj pomoże również tobie 

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Dnia 18.05.2019 o 19:44, Brum Brum napisał:

Sprawdź czy rozwiązanie, które było tutaj pomoże również tobie 

 

Losowy vip z powyższego tematu kompletnie nie działa. Jest on aktywny w "sm plugins list" lecz nie pokazuje żadnych wiadomości np. że jest za mało graczy do wylosowania vipa. A losowy vip z mojego postu takie wiadomości wysyłał, tylko, że gracz nie dostawał flag. 

 


Zapomniałem dopisać, że w podlinkowanym przez @Brum Brum losowym vipie nie występują żadne errorlogi

Przez Vasto_Lorde,

Jeśli zapomnisz i nie możesz edytować, zawsze jest opcja zgłoszenia swojego postu do moderatorów z prośbą o dopisanie czegoś. Ale oczywiście zawsze służymy pomocą nawet bez zgłaszania :D Łączę posty

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Hej! Przeanalizujmy kawałek kodu gdzie pojawia się błąd i razem logicznie dojdźmy do rozwiązania problemu. "A więc":
 

//Wiadomo, tutaj jest cała funkcja
public Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
    //Tworzymy 2 zmienne 
    //Z samych nazw możemy wywnioskować, że "winner" zawiera ID losowego gracza, a g_random_round zawiera jakąś losową liczbę oznaczającą rundę
    new winner = GetRandomPlayer(3);
    new g_random_round = GetConVarInt(Random_round);
    
    //Tutaj powiększamy Rounds o 1, zapewne zmienna globalna (bo nie widzimy jej deklaracji) i oznaczająca liczbę wszystkich przebytych rund
    //To natomiast możemy wywnioskować z tego, że jesteśmy w funkcji która wywołuje się za każdym razem gdy runda się rozpocznie
    Rounds = Rounds + 1;
    
    //Tutaj pytanie, czy dana runda która się odbywa to ta runda losowa, wcześniej zczytana do zmiennej?
    if (Rounds == g_random_round)
    
    {
        //Logicznie, wtedy do zmiennej wylosowaliśmy ID gracza wygranego, jednakże ID graczy nie może być ujemne.
        //Więc funkcja GetRandomPlayer zwraca pewnie -1 jeśli coś poszło nie tak
        if (winner == -1)
        
        {
            
            PrintToChatAll("\x04[\x04Losowanie VIP\x01] \x06Na serwerze znajduje sie za malo graczy do wylosowania losowego VIP'a\x01");
            
        } // i tu się ten warunek kończy
        
        //I teraz dzieje się coś dziwnego, bo warunek gdy winner posiada złą wartość został już "w pełni" obsłużony
        //Plugin dodaje winnerowi flagi (??) trochę dziwne bo doda je nawet jeśli winner == -1
        AddUserFlags(winner, Admin_Custom1); //W LINIJCE TEJ MAMY BŁĄD
        
        PrintToChatAll("[\x04Losowanie VIP\x01] \x06Trwa losowanie VIP'a...\x01");
        PrintToChatAll("[\x04Losowanie VIP\x01] \x06-----\x01");
        PrintToChatAll("[\x04Losowanie VIP\x01] \x06-----\x01");
        PrintToChatAll("[\x04Losowanie VIP\x01] \x06-----\x01");
        PrintToChatAll("[\x04Losowanie VIP\x01] \x06Losowym VIP'em zostaje \x02%N\x01\x06! Gratulujemy!\x01", winner);
        
    }
}

Wniosek jest taki, że potrzeba by było tutaj wstawić "else" żeby kod po if(winner == -1) wykonywał się jeśli winner nie jest równy -1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dziękuję, teraz jest już wszystko w porządku. 

Do zamknięcia.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wiadomość wygenerowana automatycznie

 

Pomoc udzielona

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.

×
×
  • Dodaj nową pozycję...