Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

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


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
8 odpowiedzi w tym temacie

#1 vercode

    Nowy

  • Nowy

Reputacja: 0
Nowy

  • Postów:4
Offline

Napisano 19.08.2019 15:48

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

  • +
  • -
  • 0

#2 K@MILOVVSKY

    Zaawansowany

  • Użytkownik

Reputacja: 35
Życzliwy

  • Postów:118
  • Steam:steam
  • Imię:Kamil
Offline

Napisano 19.08.2019 17:31

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. 


  • +
  • -
  • 0

#3 Toldi

    Czempion

  • Power User

Reputacja: 259
Wszechwidzący

  • Postów:841
  • Imię:Mateusz
  • Lokalizacja:wies
Offline

Napisano 19.08.2019 18:06

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.


  • +
  • -
  • 1

#4 vercode

    Nowy

  • Autor tematu
  • Nowy

Reputacja: 0
Nowy

  • Postów:4
Offline

Napisano 19.08.2019 19:36

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

  • +
  • -
  • 0

#5 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 19.08.2019 20:11   Najlepsza odpowiedź

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?


  • +
  • -
  • 1

#6 Toldi

    Czempion

  • Power User

Reputacja: 259
Wszechwidzący

  • Postów:841
  • Imię:Mateusz
  • Lokalizacja:wies
Offline

Napisano 19.08.2019 20:15

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

  • +
  • -
  • 1

#7 vercode

    Nowy

  • Autor tematu
  • Nowy

Reputacja: 0
Nowy

  • Postów:4
Offline

Napisano 21.08.2019 10:37

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

  • +
  • -
  • 0

#8 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 21.08.2019 10:48

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

  • +
  • -
  • 1

#9 vercode

    Nowy

  • Autor tematu
  • Nowy

Reputacja: 0
Nowy

  • Postów:4
Offline

Napisano 21.08.2019 10:50

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


  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych