←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

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 - zdjęcie 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
Odpowiedz

  • +
  • -
K@MILOVVSKY - zdjęcie 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. 

Odpowiedz

  • +
  • -
Toldi - zdjęcie 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.

Odpowiedz

  • +
  • -
vercode - zdjęcie 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
Odpowiedz

  • +
  • -
Najlepsza odpowiedź Rivit - zdjęcie 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?

Odpowiedz

  • +
  • -
Toldi - zdjęcie 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);
}
Odpowiedz

  • +
  • -
vercode - zdjęcie 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
Odpowiedz

  • +
  • -
Rivit - zdjęcie 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
Odpowiedz

  • +
  • -
vercode - zdjęcie vercode 21.08.2019

Pomogło. Dziękuję bardzo jeszcze raz wszystkim za pomoc! Temat wyczerpany i do zamknięcia  :D

Odpowiedz