Jump to content
  • Chmurka
  • Boróweczka
  • Jabłuszko
  • Limonka
  • Czekoladka
  • Węgielek
VestSmart

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

Recommended Posts

Posted (edited)

 

 

 

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)];
}

 

 

 

 

 

 

 

 

 

 

 

 

Edited by VestSmart

Share this post


Link to post
Share on other sites
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

By 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

Share this post


Link to post
Share on other sites

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

  • Lubię to! 1
  • Dobry pomysł! 1

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

Nasza historia

Na początku byliśmy małą grupą internetowych znajomych, którzy stwierdzili, że potrzebne jest solidne forum, na którym znajdą się ludzie z dużą wiedzą programistyczną ukierunkowaną na CS:GO. Pomysł powstał na początku 2018 roku, a parę miesięcy później, 19 kwietnia, powstała ta strona internetowa. Jako alternatywna odpowiedź na inne tego typu miejsca, poważnie podeszliśmy do tematu, najpierw tłumacząc angielską dokumentację SourceMod'a na język polski, a potem pisząc rozległe poradniki i wypełniając forum najpotrzebniejszymi rzeczami dla właścicieli serwerów i programistów. Cała nasza Ekipa jest dumna z pracy jaką w to włożyliśmy i cieszymy się że zbierają się wokół nas zarówno ludzie znający tematy sourcepawn'a i konfiguracji, jak i również nowe twarze w tym "biznesie", którym z chęcią niesiemy wiedzę oraz pomoc w rozwiązywaniu problemów.

Największe modyfikacje serwerowe

×
×
  • Create New...