VestSmart Napisano 18 Maja 2019 (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 18 Maja 2019 przez VestSmart Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Brum Brum Napisano 18 Maja 2019 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
VestSmart Napisano 19 Maja 2019 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, 20 Maja 2019 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
VestSmart Napisano 20 Maja 2019 @Refresh Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Vasto_Lorde 1 1 Napisano 20 Maja 2019 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
VestSmart Napisano 23 Maja 2019 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
Vasto_Lorde 1 Napisano 23 Maja 2019 Wiadomość wygenerowana automatycznie Pomoc udzielona Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach