Dodawanie do statystyk
Najlepsza odpowiedź Rivit 19.08.2019 20:11
public bunt(id, attacker, shouldgib) // Zliczanie buntow { if(!is_user_connected(id) || !is_user_connected(attacker) || attacker == id) return HAM_IGNORED; if(cs_get_user_team(id) == CS_TEAM_CT && cs_get_user_team(attacker) == CS_TEAM_T && !zyczenie && ilosc_terro() > 2) { user_bunty[attacker]++; ColorChat( attacker, attacker, "^4[Jail]^3 Bunt dodany do statystyk."); SQL_FormatQuery("UPDATE `JailUsers` SET `Bunty` = (`Bunty` + 1) WHERE `Name` = '%s';", nazwa_gracza[attacker]); SQL_ThreadQuery(info, "ZapiszDane", gszQuery); } return HAM_IGNORED; }
Zobacz wogóle czy ten public się wykonuje za kazdym razem, nawet w sytuacji gdy nie zadziała dodawanie życzen. Wyprintuj sobie zmienne które są w tym publicu i prześledź jakie mają wartości w momencie gdy bug występuje.
Domyślam sie ze bunt to jest handler od Ham_Killed.
Może wiezien zabija straznika jakąś bronią, która zabija gracza jakoś własnym sposobem i ten hook nie jest w stanie tego wychwycic?
Przejdź do postu
vercode
19.08.2019
Witam. Mam problem na serwerze z naliczaniem buntów. Dodam, że to moje początki dopiero, jeśli chodzi o pluginy. Bunt do statystyk dla niektórych graczy zostaje zliczany, a dla niektórych nie - nawet, gdy w tej samej rundzie jest dwóch strażników i różne osoby ich zabiją to jednej osobie doda do statystyk, a jednej nie. Warunek wygląda następująco:
new bool:zyczenie;
[...]
public bunt(id, attacker, shouldgib) { if(!is_user_connected(id) || !is_user_connected(attacker) || attacker == id) return HAM_IGNORED; if(cs_get_user_team(id) == CS_TEAM_CT && cs_get_user_team(attacker) == CS_TEAM_T && !zyczenie && ilosc_terro() > 2) { [...] } return HAM_IGNORED; }
bool zyczenie jest ustawiany na true w przypadku, gdy wiezien otrzymuje zyczenie, aby nie został naliczony mu bunt (nalicza aktualnie i nie wiem rowniez co z tym zrobic), a na koniec rundy jest ustawiany na false. ilosc_terro - stock zliczajacy graczy w druzynie terro.
Użytkownik vercode edytował ten post 19.08.2019 15:49
K@MILOVVSKY
19.08.2019
Sprawdź, czy zmienna logiczna "zyczenie" nie zmienia się w na true/false gdzieś indziej w kodzie. CTRL + F > "zyczenie". Dobrze by też było widzieć cały kod.
Toldi
19.08.2019
Nie powinno być czasem
new bool:zyczenie[33];
żeby uwzględniać konkretnego gracza a nie wszystkich. Bo aktualnie ktoś zabije strażnika i ustawiasz życzenie na true a kolejny gracz, który zabije strażnika w tej samej rundzie już nie ma prawa go dostać przez ten warunek
if(cs_get_user_team(id) == CS_TEAM_CT && cs_get_user_team(attacker) == CS_TEAM_T && !zyczenie && ilosc_terro() > 2)
a konkretniej przez !zyczenie gdyż w momencie ustawienia tej zmiennej na true cały kod poniżej już się nie wykona oczywiście jeżeli warunki są spełnione. Pokaż cały ten public a nie kawałeczek z którego i tak nie wiele wiadomo.
vercode
19.08.2019
Sprawdź, czy zmienna logiczna "zyczenie" nie zmienia się w na true/false gdzieś indziej w kodzie. CTRL + F > "zyczenie". Dobrze by też było widzieć cały kod.
Nigdzie więcej nie jest to wykorzystywane.
Public odpowiedzialny za zliczanie życzeń oraz buntów.
public OnLastPrisonerShowWish(id) //Zliczanie zyczen > Wywołuje się podczas wybrania zyczenie przez ostatniego więźnia. { zyczenie = true; if(ilosc_terro() > 2) { new id_straznik = jail_get_prowadzacy(); user_zyczenia[id]++; user_zyczenia[id_straznik]++; SQL_FormatQuery("UPDATE `JailUsers` SET `Zyczenia` = (`Zyczenia` + 1) WHERE `Name` = '%s';", nazwa_gracza[id]); SQL_ThreadQuery(info, "ZapiszDane", gszQuery); ColorChat(id, id, "^4[Jail]^3 Zyczenie dodane do statystyk."); SQL_FormatQuery("UPDATE `JailUsers` SET `Zyczenia` = (`Zyczenia` + 1) WHERE `Name` = '%s';", nazwa_gracza[id_straznik]); SQL_ThreadQuery(info, "ZapiszDane", gszQuery); ColorChat(id_straznik, id_straznik, "^4[Jail]^3 Zyczenie dodane do statystyk."); } } public OnRemoveData() // Wywołuje się podczas zakonczenia kazdego dnia (rundy), przeznaczony do resetowania zmiennych. { zyczenie = false; } public bunt(id, attacker, shouldgib) // Zliczanie buntow { if(!is_user_connected(id) || !is_user_connected(attacker) || attacker == id) return HAM_IGNORED; if(cs_get_user_team(id) == CS_TEAM_CT && cs_get_user_team(attacker) == CS_TEAM_T && !zyczenie && ilosc_terro() > 2) { user_bunty[attacker]++; ColorChat( attacker, attacker, "^4[Jail]^3 Bunt dodany do statystyk."); SQL_FormatQuery("UPDATE `JailUsers` SET `Bunty` = (`Bunty` + 1) WHERE `Name` = '%s';", nazwa_gracza[attacker]); SQL_ThreadQuery(info, "ZapiszDane", gszQuery); } return HAM_IGNORED; }
Opis forward'ow jest obok (cypisa). U jednych graczy to działa i dodaje, a u innych nie.
Co do postu wyżej jeszcze: gdy ktoś zabije strażnika to bool nie ulega zmianie. Ulega on tylko zmianie, gdy więzień wybierze życzenie, ponieważ wywoła się forward OnLastPrisonerShowWish oraz na koniec rundy czyli bez względu czy był bunt, czy zostało wybrane życzenie - OnRemoveData. Tylko w tych miejscach co przedstawiłem jest użyty ten bool, nigdzie więcej. Ostatni więzień dostaje możliwość wybrania życzenia, gdy prowadzący wydzieli na to zgodę, więc bool do czasu wyboru życzenia jest na false przez forward wywołany pod koniec wcześniejszej rundy. Uwzględnienie konkretnego gracza raczej nie pomoże.
Jak ten wycinek nie wystarcza co umieściłem to wybaczcie i dajcie znać - jw pisałem zielony w to jeszcze jestem.
Użytkownik vercode edytował ten post 19.08.2019 19:39
Najlepsza odpowiedź
Rivit
19.08.2019
public bunt(id, attacker, shouldgib) // Zliczanie buntow { if(!is_user_connected(id) || !is_user_connected(attacker) || attacker == id) return HAM_IGNORED; if(cs_get_user_team(id) == CS_TEAM_CT && cs_get_user_team(attacker) == CS_TEAM_T && !zyczenie && ilosc_terro() > 2) { user_bunty[attacker]++; ColorChat( attacker, attacker, "^4[Jail]^3 Bunt dodany do statystyk."); SQL_FormatQuery("UPDATE `JailUsers` SET `Bunty` = (`Bunty` + 1) WHERE `Name` = '%s';", nazwa_gracza[attacker]); SQL_ThreadQuery(info, "ZapiszDane", gszQuery); } return HAM_IGNORED; }
Zobacz wogóle czy ten public się wykonuje za kazdym razem, nawet w sytuacji gdy nie zadziała dodawanie życzen. Wyprintuj sobie zmienne które są w tym publicu i prześledź jakie mają wartości w momencie gdy bug występuje.
Domyślam sie ze bunt to jest handler od Ham_Killed.
Może wiezien zabija straznika jakąś bronią, która zabija gracza jakoś własnym sposobem i ten hook nie jest w stanie tego wychwycic?
Toldi
19.08.2019
Nie wiedziałem że są inne zmienne przechowujące ilość życzeń gracza dlatego mój post wyżej wygląda jak wygląda. Standardowo sprawdź logi. Może w nich coś się znajdzie bo w sumie powinno dodawać bunty bo i tak życzenie ma dopiero ostatni terro i ta zmienna jest wtedy równa true. Tak po za tym nie powinno być czasami
ColorChat( attacker, GREEN, "^4[Jail]^3 Bunt dodany do statystyk."); // GREEN / RED/ YELLOW
Zamień ifa na tego i sprawdzaj sb komu dodaje bunt i w jakiej sytuacji ich nie dodaje
if(cs_get_user_team(id) == CS_TEAM_CT && cs_get_user_team(attacker) == CS_TEAM_T && !zyczenie && ilosc_terro() > 2) { user_bunty[attacker]++; ColorChat( attacker, attacker, "^4[Jail]^3 Bunt dodany do statystyk."); ColorChat( 0, GREEN, "^4[Jail]^3 Dodano bunt graczowi^4 %s.", nazwa_gracza[attacker]); SQL_FormatQuery("UPDATE `JailUsers` SET `Bunty` = (`Bunty` + 1) WHERE `Name` = '%s';", nazwa_gracza[attacker]); SQL_ThreadQuery(info, "ZapiszDane", gszQuery); }
vercode
21.08.2019
Tak, bunt to był handler od ham_killed i wziąłem pod uwagę twoją sugestię TibacK i spróbowałem zastąpić to w ten sposób:
register_event("DeathMsg", "DeathMsg", "a");
public DeathMsg() // ZLiczanie buntów { new buntownik = read_data(1); new ofiara = read_data(2); if(cs_get_user_team(ofiara) == CS_TEAM_CT && cs_get_user_team(buntownik) == CS_TEAM_T && !zyczenie && ilosc_terro() > 2) { user_bunty[buntownik]++; ColorChat( buntownik, GREEN, "^4[Jail]^3 Bunt dodany do statystyk."); ColorChat( 0, buntownik, "^4[BUNTY]^3 Dodano bunt graczowi^4 %s.", nazwa_gracza[buntownik]); SQL_FormatQuery("UPDATE `JailUsers` SET `Bunty` = (`Bunty` + 1) WHERE `Name` = '%s';", nazwa_gracza[buntownik]); SQL_ThreadQuery(info, "ZapiszDane", gszQuery); } }
Na chwile obecną z tego co sprawdzałem zlicza bunty, więc dziękuję za pomoc i sugestie.
Jeszcze mam jeden problem w związku z tym jak spróbowałem to zastąpić - w tej linijce:
if(cs_get_user_team(ofiara) == CS_TEAM_CT && cs_get_user_team(buntownik) == CS_TEAM_T && !nielicz && ilosc_terro() > 2)
wyskakuje mi: warning 217: loose indentation przy kompilowaniu pliku - szukałem pomocy na forum i jest to podobno inny odstęp zrobiony spacją lub tab, poprawiałem i dalej tak samo mam, czy jest to coś innego? Z tego tematu: https://amxx.pl/topi...zy-komplikacji/ to zaczerpnąłem.
Użytkownik vercode edytował ten post 21.08.2019 10:41
Rivit
21.08.2019
warning 217: loose indentation
możesz to olać szczerze mówiąc.
Generalnie chodzi o wcięcia w kodzie (to nie wplywa na dzialanie pluginu).
uzyj jakiegos formatera kodu czy coś albo popraw wcięcia i trzymaj konsekwentny ich styl.
Jak chcesz szybko przekonwertowac spacje na taby albo w druga strone to polecam Ci Sublime text, ma taką opcję
Możesz spróbowac dodać na samą góre pluginu to:
#pragma tabsize 0
vercode
21.08.2019
Pomogło. Dziękuję bardzo jeszcze raz wszystkim za pomoc! Temat wyczerpany i do zamknięcia