Skocz do zawartości

  • Zaloguj korzystając z Facebooka Zaloguj korzystając z Twittera Zaloguj przez Steam Zaloguj poprzez Google      Logowanie »   
  • Rejestracja

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
CoD Nowy

[ROZWIĄZANE] 1/x z Broni , 1/1 z Granatu, Dmg + Int Przy Pomocy SetParamFloat ?

cod nowy

Najlepsza odpowiedź BlackPerfum, 27.06.2014 14:21

Nie rozumiem dlaczego mam nie uzywac cod_inflict_damage().

Już tłumaczę:
 
Funkcja cod_inflict_damage to nic innego niż:

ExecuteHam(Ham_TakeDamage,id,ent,attacker,Float:damage,damagebits)

Tylko dodatkowo w dmg może zostać uwzgledniony pewien procent int'a gracza. Jeśli to hamsandwich zadaje dmg to co jest złe?? A to że używasz ExecuteHam a nie ExecuteHamB różnica ogromna choć pozornie mała. Dodanie na samym końcu nazwy funkcji "B" sprawi  iż tą funkcję będą mogły złapać inne pluginy. Tzn. tak jak mówiłem wyżej. Grasz klasą np. Szturmowiec która ma dodatkowe 10 dmg z m4(dodane twoim sposobem). a jakis gracz w przeciwnym teamie gra klasa AntySzturmowiec która posiada w evencie ham_takeDamage blokuje wszystkie dmg z m4. W pewnym momęcie strzelacie do siebie (twoja bron to m4)  i o dziwo zadajesz mu dmg!!! Bo on nie był w stanie satrzymać tego dodatkowego dmg! Dlatego udało ci się go zabić biggrin.png
Przykład w którym widac że dmg zadawane tym sposobem nie mozna modyfikować (za pomocą hamsandwich'a)
 
Wniosek: Jeśli zmodyfikujesz swojego cod'a i dodasz tam "B" to możesz używać tej funkcji to zadawania dmg. Nadal nie możesz używać jej do zwiększenia dmg. Dlaczego?? Bo jak za pomocą jej zwiększysz dmg == ∞ (wtf? moja nieskończonośc zmalała :( )
Dlaczego? Bo wykonujesz pętle nieskończoną. Zadając komuś dmg (normalnie pistoletem) sprawiasz że wykonuje się funkcja zarejestrowana w ham'ie nastepnie dodajesz w ten sposób dmg co sprawia że znowu ta funkcja się wykonuje i znowu dodajesz dmg i znowu...

 

 

Jak modyfikować dmg?

Według mnie najlepiej robic to tak:

 

W Ham_TakeDamage (pre) dodawać / odejmować dmg (za pomocą SetHamParmFloat)

Mozna także tutaj zrobić blokowanie dmg za pomoca zwrócenia supercode a także można tu robic 1/x za pomocą Ham_Killed

 

W Ham TakeDamage (post) mnożyć / dzielić dmg  (za pomocą SetHamParmFloat) oraz dopiero tutaj pytać się jakie gracz zadał dmg. tzn. dopiero tutaj np. zabierać wytrzymalośc przedmiotu (w zależności od dmg) albo dodawać expa (w zależności od dmg) dlaczego dopiero tutaj bo to jest dmg końcowe to dmg już nie podlega zmianie (a to w pre tak)

 

Tak naprawdę to by sie przydały trzy eventy:

- pierwszy na doddawanie/odejmowanie dmg

- drugi na mnożenie/dzielenie dmg

- i trzeci: pobieranie dmg i działanie nad nim ale nie zmienianie go

 

 

 

Przejdź do postu


  • Zamknięty Temat jest zamknięty
20 odpowiedzi w tym temacie

#1 ex0

    Wolny strzelec.

  • Power User

Reputacja: 380
Wszechpomocny

  • Postów:1127
  • GG:
  • Imię:Kacper
  • Lokalizacja:Żywiec
Offline

Napisano 21.06.2014 06:31

Dzień Dobry!
Witam wszystkich w sobotni poranek.

Chciałem zapytać się, czy poprawnie zrobiłem funkcję 1/x z broni ponieważ w końcu zaczęła działać.

Zastosowałem zamiast ExcuteHam - SetParamFloat i wygląda to już lepiej.


 

public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{
	
	if(!is_user_connected(idattacker))
		return HAM_IGNORED; 
	
	if(!ma_klase[idattacker])
		return HAM_IGNORED;
	
	if(damagebits & DMG_BULLET)
	{	
		new weapon = get_user_weapon(idattacker);
	
		if(weapon == CSW_HEGRENADE && damage > 20.0)
			SetHamParamFloat(this, float(get_user_health(this)));
	
		if(weapon == CSW_M4A1 && damage > 20.0 && random_num(1,6) == 1) 
			SetHamParamFloat(this, float(get_user_health(this)));
			
		if(weapon == CSW_AK47 && damage > 20.0 && random_num(1,6) == 1) 
			SetHamParamFloat(this, float(get_user_health(this)));	
	
		if(weapon == CSW_DEAGLE && damage > 20.0 && random_num(1,6) == 1) 
			SetHamParamFloat(this, float(get_user_health(this)));				
	
		if(get_user_team(this) != get_user_team(idattacker) && get_user_weapon(idattacker) == CSW_M4A1 && damagebits & DMG_BULLET)
			SetHamParamFloat(this, float(get_user_health(this)));
			
			
		
		return HAM_HANDLED;
	}
	
	return HAM_IGNORED;
	
}

Moje pytanie teraz, jak zrobić tutaj 1/1 z granatu jak ma być, ponieważ to co próbowałem zrobić niestety nie działa.

Oraz jak zrobić DMG + INT z M4A1 przykładowo też w tym systemie?

Pozdrawiam !


  • +
  • -
  • 0

TWORZENIE FOR SPOŁECZNOŚCIOWYCH | ZARZĄDZANIE STRONAMI INTERNETOWYMI
WSPARCIE TECHNICZNE SERWERÓW HLDS | MODERNIZACJA, OPTYMALIZACJA, ZABEZPIECZENIA


Zapraszam do mojego profilu ;)


#2 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 454
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 25.06.2014 21:39

Chciałem zapytać się, czy poprawnie zrobiłem funkcję 1/x z broni ponieważ w końcu zaczęła działać.

Nie :D Pamiętaj że inny plugin może zmodyfikowac dmg tak że ono wbrew pozorom nie zabije gracza. Pełno niedociągnięć :( Ostatnio był podobny temat :D

 

Coś takiego zadziała xD

#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>

const m_iId = 43

public plugin_init()
{
	register_plugin("Tak sie zabija graczy!!!", "", "BlackPerfum(Zjem ci Noge)")
	RegisterHam(Ham_TakeDamage, "player", "TakeDamage",0)		//Rejestruje momęt zadania dmg graczu
	//Jeśli chcesz robic tu tylko 1/x to najlepiej pre (4 arg == 0) :D
}

public TakeDamage(id, ent, attacker, Float:damage, damagebits)
{
	if(!is_user_connected(attacker) || !is_user_alive(id) || id == attacker || !ma_klase[attacker])	return HAM_IGNORED
	// Sprawdzam czy osoba zadająca dmg jest graczem (+ czy jest na serwie)
	// Sprawdzam też czy osobę otrzymującą dmg nie zabił jakiś inny plugin
	// Sprawdzam czy ktoś nie zadał sam sobie dmg
	// Sprawdzam czy ma klase
	// Zakładam że na serwerze jest wyłączone friendlyfire bo niece mi się tego sprawdzać xD
	
	static Float:OldDamage
	OldDamage = damage //Przyda się przy zmianie dmg xD
	
	if(ent == attacker)// Porównuje byt zadający dmg z bytem gracza 
	{	
		//(tzn. warunek spełni się gdy to gracz zada dmg bezpośrednio czyli nie za pomocą he lub innych bytów)
		if(damagebits & DMG_BULLET)
		{	
			//Na wszelki wypadek możemy sprawdzić czy to na pewno broń zadaje dmg
		
			// Jeśli żaden plugin nie zabił atakującego to jest nie możliwym by nie żył dlatego spokojnie można pobrać jego broń
			switch(get_user_weapon(attacker))	//Sprawdzam aktualną broń atakującego
			{
				case CSW_M4A1:
				{
					//Jeśli to m4
					if(!random(6))
					{
						//I jeśli atakującemu się poszczęściło gdyż ma tylko 16,(6)% (1/6(ta szóstka jest tą z random)*100% = 16,(6)%)
						//To zabijam trafionego ale robie to tak by pluginy mogły to wychwycić
						ExecuteHamB(Ham_Killed, id, attacker, 1) //Gracz zabity i koniec ciężkich zmagań z zadawaniem dmg
					}
					else
					{
						//Ale nie uważamy że klasa nadal jest za słaba
						//To dodajmy jej 20 dmg uwzględniając int
						damage += 20.0+float(cod_get_user_intelligence(attacker,1,1,1))*//Czynnik_Inteligencji
						//Czynnik inteligencji podmieniasz dowolną liczbą
						//Czynnik inteligencji sobie robisz jaki ci się żywnie podoba xD
						//Czynnik inteligencji to jest dokładnie to samo co:
						//cod_inflict_damage(attacker, id, damage+20.0, Czynnik_Inteligencji, ent, damagebits)
						//Np. jak gracz ma 100 inta i ustawisz czynnik inteligencji na 0.2 to doda do dmg
						//te 20 dmg+100(int)/(1/0.2 == 5) == 100/5=25 końcowe dmg == damage+20(standardowe)+25(od inta)
					}
				}
				case CSW_AK47:	if(!random(6))	ExecuteHamB(Ham_Killed, id, attacker, 1)	//To samo co wyżej tylko bez komentarzy
				case CSW_DEAGLE:	if(!random(6))	ExecuteHamB(Ham_Killed, id, attacker, 1)
				// Użyłem case byś mógł łatwo dodawać sobie bronie gdyż widziałem że ich tam parę masz
				// Pamiętaj w tym warunku nie złapiesz zadanie dmg przez he, lub inne byty niż gracz(i bronie palne+nóż)
			}
		}
	}
	else
	{
		// Tutaj można się pokwapić o złapanie zadania dmg he
		// pobieranie broni nam tu nie pomoże gdyz gracz wyrzucił he i ma coś innego w łapie 
		// chyba że miał ich parę i nie zmienił broni ale nam to pomocne nie będzie gdyż szansa na to jest równa 1 na 1/0
		// Można pobrać classname ent'a zadającego dmg i porównać go do "weapon_hegranade" ale nie lubimy zbyt często porównywać string'ów
		// Dlatego z pomocą przychodzi nam fakemeta
		// Spróbujmy pobrać id broni ale nie bytu
		//Ale najpierw trzeba sprawdzić czy byt przechowuje jakieś dane (nie lubimy błędów w konsoli)
		if(pev_valid(ent) == 2)
		{
			//Czyli jeśli byt przechowuje dane
			new weapon = get_pdata_int(ent,m_iId,4)
			//To pobierami jego id z CSW_*
			//I porównujemy z CSW_HEGRENADE
			if(weapon == CSW_HEGRENADE)//A zatem jeśli byt zadający dmg to he
			{
				//To zabijam gracza
				ExecuteHamB(Ham_Killed, id, attacker, 1) // I to wszystko
			}
		}
	}
	//Teraz sprawdźmy czy zmieniliśmy końcowe dmg:
	if(damage != OldDamage)
	{
		//Jesli zmieniliśmy to trzeba wysłać zmienione dmg + prawowićie zakończyć funkcję
		SetHamParamFloat(4,damage)
		return HAM_HANDLED
	}
	//Jeśli dmg nie zostało zmienione to metamod spokojnie może zlekceważyć tą funkcję :D
	return HAM_IGNORED
}

  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#3 ex0

    Wolny strzelec.

  • Autor tematu
  • Power User

Reputacja: 380
Wszechpomocny

  • Postów:1127
  • GG:
  • Imię:Kacper
  • Lokalizacja:Żywiec
Offline

Napisano 26.06.2014 07:22

 

Chciałem zapytać się, czy poprawnie zrobiłem funkcję 1/x z broni ponieważ w końcu zaczęła działać.

Nie :D Pamiętaj że inny plugin może zmodyfikowac dmg tak że ono wbrew pozorom nie zabije gracza. Pełno niedociągnięć :( Ostatnio był podobny temat :D

 

Coś takiego zadziała xD

#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>

const m_iId = 43

public plugin_init()
{
	register_plugin("Tak sie zabija graczy!!!", "", "BlackPerfum(Zjem ci Noge)")
	RegisterHam(Ham_TakeDamage, "player", "TakeDamage",0)		//Rejestruje momęt zadania dmg graczu
	//Jeśli chcesz robic tu tylko 1/x to najlepiej pre (4 arg == 0) :D
}

public TakeDamage(id, ent, attacker, Float:damage, damagebits)
{
	if(!is_user_connected(attacker) || !is_user_alive(id) || id == attacker || !ma_klase[attacker])	return HAM_IGNORED
	// Sprawdzam czy osoba zadająca dmg jest graczem (+ czy jest na serwie)
	// Sprawdzam też czy osobę otrzymującą dmg nie zabił jakiś inny plugin
	// Sprawdzam czy ktoś nie zadał sam sobie dmg
	// Sprawdzam czy ma klase
	// Zakładam że na serwerze jest wyłączone friendlyfire bo niece mi się tego sprawdzać xD
	
	static Float:OldDamage
	OldDamage = damage //Przyda się przy zmianie dmg xD
	
	if(ent == attacker)// Porównuje byt zadający dmg z bytem gracza 
	{	
		//(tzn. warunek spełni się gdy to gracz zada dmg bezpośrednio czyli nie za pomocą he lub innych bytów)
		if(damagebits & DMG_BULLET)
		{	
			//Na wszelki wypadek możemy sprawdzić czy to na pewno broń zadaje dmg
		
			// Jeśli żaden plugin nie zabił atakującego to jest nie możliwym by nie żył dlatego spokojnie można pobrać jego broń
			switch(get_user_weapon(attacker))	//Sprawdzam aktualną broń atakującego
			{
				case CSW_M4A1:
				{
					//Jeśli to m4
					if(!random(6))
					{
						//I jeśli atakującemu się poszczęściło gdyż ma tylko 16,(6)% (1/6(ta szóstka jest tą z random)*100% = 16,(6)%)
						//To zabijam trafionego ale robie to tak by pluginy mogły to wychwycić
						ExecuteHamB(Ham_Killed, id, attacker, 1) //Gracz zabity i koniec ciężkich zmagań z zadawaniem dmg
					}
					else
					{
						//Ale nie uważamy że klasa nadal jest za słaba
						//To dodajmy jej 20 dmg uwzględniając int
						damage += 20.0+float(cod_get_user_intelligence(attacker,1,1,1))*//Czynnik_Inteligencji
						//Czynnik inteligencji podmieniasz dowolną liczbą
						//Czynnik inteligencji sobie robisz jaki ci się żywnie podoba xD
						//Czynnik inteligencji to jest dokładnie to samo co:
						//cod_inflict_damage(attacker, id, damage+20.0, Czynnik_Inteligencji, ent, damagebits)
						//Np. jak gracz ma 100 inta i ustawisz czynnik inteligencji na 0.2 to doda do dmg
						//te 20 dmg+100(int)/(1/0.2 == 5) == 100/5=25 końcowe dmg == damage+20(standardowe)+25(od inta)
					}
				}
				case CSW_AK47:	if(!random(6))	ExecuteHamB(Ham_Killed, id, attacker, 1)	//To samo co wyżej tylko bez komentarzy
				case CSW_DEAGLE:	if(!random(6))	ExecuteHamB(Ham_Killed, id, attacker, 1)
				// Użyłem case byś mógł łatwo dodawać sobie bronie gdyż widziałem że ich tam parę masz
				// Pamiętaj w tym warunku nie złapiesz zadanie dmg przez he, lub inne byty niż gracz(i bronie palne+nóż)
			}
		}
	}
	else
	{
		// Tutaj można się pokwapić o złapanie zadania dmg he
		// pobieranie broni nam tu nie pomoże gdyz gracz wyrzucił he i ma coś innego w łapie 
		// chyba że miał ich parę i nie zmienił broni ale nam to pomocne nie będzie gdyż szansa na to jest równa 1 na 1/0
		// Można pobrać classname ent'a zadającego dmg i porównać go do "weapon_hegranade" ale nie lubimy zbyt często porównywać string'ów
		// Dlatego z pomocą przychodzi nam fakemeta
		// Spróbujmy pobrać id broni ale nie bytu
		//Ale najpierw trzeba sprawdzić czy byt przechowuje jakieś dane (nie lubimy błędów w konsoli)
		if(pev_valid(ent) == 2)
		{
			//Czyli jeśli byt przechowuje dane
			new weapon = get_pdata_int(ent,m_iId,4)
			//To pobierami jego id z CSW_*
			//I porównujemy z CSW_HEGRENADE
			if(weapon == CSW_HEGRENADE)//A zatem jeśli byt zadający dmg to he
			{
				//To zabijam gracza
				ExecuteHamB(Ham_Killed, id, attacker, 1) // I to wszystko
			}
		}
	}
	//Teraz sprawdźmy czy zmieniliśmy końcowe dmg:
	if(damage != OldDamage)
	{
		//Jesli zmieniliśmy to trzeba wysłać zmienione dmg + prawowićie zakończyć funkcję
		SetHamParamFloat(4,damage)
		return HAM_HANDLED
	}
	//Jeśli dmg nie zostało zmienione to metamod spokojnie może zlekceważyć tą funkcję :D
	return HAM_IGNORED
}

1/x działa poprawnie ale tak jak wspominałem Ci kiedyś na PW, ponownie występuję to, że gdy zabiję kogoś 1/x to wtedy wyskakuje taki znaczek jak choćby przy samobójstwie i kolejny problem a mianowicie można zabić swojego gdy strzelisz do niego to wykonuje się na nim samobójstwo tak jakby był włączony FF.

Kolejna sprawa 1/1 z Granatu nadal nie działa, więc to Twoje 100% odnosi się tylko do tego, że wprowadziliśmy teraz totalny mord haha xD


  • +
  • -
  • 0

TWORZENIE FOR SPOŁECZNOŚCIOWYCH | ZARZĄDZANIE STRONAMI INTERNETOWYMI
WSPARCIE TECHNICZNE SERWERÓW HLDS | MODERNIZACJA, OPTYMALIZACJA, ZABEZPIECZENIA


Zapraszam do mojego profilu ;)


#4 TibacK

    Diler pod gimnazjum dla niepełnosprawnych dzieci

  • Power User

Reputacja: 487
Wszechobecny

  • Postów:2513
Online

Napisano 26.06.2014 07:44

Po co Ci to?

damage > 20.0

Chcesz żeby szansa na zabicie działała jeśli obrażenia są większe od 20?

#define DMG_HEGRENADE (1<<24)

public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{	
	if(!is_user_connected(idattacker)) return HAM_IGNORED;
	if(!ma_klase[idattacker]) return HAM_IGNORED;
      if(get_user_team(this) == get_user_team(idattacker) return HAM_IGNORED; // atak swojego
	
	if(damagebits & DMG_BULLET) //czy dmg sa z pocisku
	{	
		new weapon = get_user_weapon(idattacker);
	
		if(weapon == CSW_M4A1)
		{
                  if(random_num(1, 6) == 1) // 1/6 z m4)
                        SetHamParamFloat(this, float(get_user_health(this)));
                  else      
                     cod_inflict_damage(idattacker, this, damage+3, 0.5, idinflictor, damagebits); // dodatkowe dmg (+3) i mnoznik inteligencji (2 pkt = 1 dmg)
		}
			
		if(weapon == CSW_AK47 && random_num(1, 6) == 1) // 1/6 z ak
			cod_inflict_damage(idattacker, this, float(get_user_health(this), 0.0, idinflictor, damagebits);	
	
		if(weapon == CSW_DEAGLE && random_num(1, 6) == 1) //1/6 z dgl
			cod_inflict_damage(idattacker, this, float(get_user_health(this), 0.0, idinflictor, damagebits);		
		
		return HAM_HANDLED;
	}
	
	else if(damagebits & DMG_HEGRENADE) //dmg z granatu
	{
           cod_inflict_damage(idattacker, this, float(get_user_health(this), 0.0, idinflictor, damagebits);
	}
	
	return HAM_IGNORED;
	
}

Pisałem na szybko. Sprawdz może zadziała


  • +
  • -
  • 0

#5 ex0

    Wolny strzelec.

  • Autor tematu
  • Power User

Reputacja: 380
Wszechpomocny

  • Postów:1127
  • GG:
  • Imię:Kacper
  • Lokalizacja:Żywiec
Offline

Napisano 26.06.2014 15:54

Po co Ci to?

damage > 20.0

Chcesz żeby szansa na zabicie działała jeśli obrażenia są większe od 20?

#define DMG_HEGRENADE (1<<24)

public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{	
	if(!is_user_connected(idattacker)) return HAM_IGNORED;
	if(!ma_klase[idattacker]) return HAM_IGNORED;
      if(get_user_team(this) == get_user_team(idattacker) return HAM_IGNORED; // atak swojego
	
	if(damagebits & DMG_BULLET) //czy dmg sa z pocisku
	{	
		new weapon = get_user_weapon(idattacker);
	
		if(weapon == CSW_M4A1)
		{
                  if(random_num(1, 6) == 1) // 1/6 z m4)
                        SetHamParamFloat(this, float(get_user_health(this)));
                  else      
                     cod_inflict_damage(idattacker, this, damage+3, 0.5, idinflictor, damagebits); // dodatkowe dmg (+3) i mnoznik inteligencji (2 pkt = 1 dmg)
		}
			
		if(weapon == CSW_AK47 && random_num(1, 6) == 1) // 1/6 z ak
			cod_inflict_damage(idattacker, this, float(get_user_health(this), 0.0, idinflictor, damagebits);	
	
		if(weapon == CSW_DEAGLE && random_num(1, 6) == 1) //1/6 z dgl
			cod_inflict_damage(idattacker, this, float(get_user_health(this), 0.0, idinflictor, damagebits);		
		
		return HAM_HANDLED;
	}
	
	else if(damagebits & DMG_HEGRENADE) //dmg z granatu
	{
           cod_inflict_damage(idattacker, this, float(get_user_health(this), 0.0, idinflictor, damagebits);
	}
	
	return HAM_IGNORED;
	
}

Pisałem na szybko. Sprawdz może zadziała

Nie działa niestety.


  • +
  • -
  • 0

TWORZENIE FOR SPOŁECZNOŚCIOWYCH | ZARZĄDZANIE STRONAMI INTERNETOWYMI
WSPARCIE TECHNICZNE SERWERÓW HLDS | MODERNIZACJA, OPTYMALIZACJA, ZABEZPIECZENIA


Zapraszam do mojego profilu ;)


#6 TibacK

    Diler pod gimnazjum dla niepełnosprawnych dzieci

  • Power User

Reputacja: 487
Wszechobecny

  • Postów:2513
Online

Napisano 26.06.2014 17:53

Nie dziala? Ale co nie dziala? Bo najlepiej napisac nie dziala, a Ty sie męcz z tym.
  • +
  • -
  • 0

#7 ex0

    Wolny strzelec.

  • Autor tematu
  • Power User

Reputacja: 380
Wszechpomocny

  • Postów:1127
  • GG:
  • Imię:Kacper
  • Lokalizacja:Żywiec
Offline

Napisano 27.06.2014 06:20

Nie dziala? Ale co nie dziala? Bo najlepiej napisac nie dziala, a Ty sie męcz z tym.

Przede wszystkim dzikło, nie kompilowało wyrzucało dziwnne errory jak niepodomykane stringi etc. Pomijając już to gdy wrzuciłem na serwer to nadal granat nie działał.
Logów = Brak.


  • +
  • -
  • 0

TWORZENIE FOR SPOŁECZNOŚCIOWYCH | ZARZĄDZANIE STRONAMI INTERNETOWYMI
WSPARCIE TECHNICZNE SERWERÓW HLDS | MODERNIZACJA, OPTYMALIZACJA, ZABEZPIECZENIA


Zapraszam do mojego profilu ;)


#8 TibacK

    Diler pod gimnazjum dla niepełnosprawnych dzieci

  • Power User

Reputacja: 487
Wszechobecny

  • Postów:2513
Online

Napisano 27.06.2014 06:44

#define DMG_HEGRENADE (1<<24)

public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{	
	if(!is_user_connected(idattacker)) return HAM_IGNORED;
	if(!ma_klase[idattacker]) return HAM_IGNORED;
      if(get_user_team(this) == get_user_team(idattacker) return HAM_IGNORED; // atak swojego
	
	if(damagebits & DMG_BULLET) //czy dmg sa z pocisku
	{	
		new weapon = get_user_weapon(idattacker);
	
		if(weapon == CSW_M4A1)
		{
                  if(random_num(1, 6) == 1) // 1/6 z m4)
                        cod_inflict_damage(idattacker, this, float(get_user_health(this)), 0.0, idinflictor, damagebits);
                  else      
                     cod_inflict_damage(idattacker, this, damage+3, 0.5, idinflictor, damagebits); // dodatkowe dmg (+3) i mnoznik inteligencji (2 pkt = 1 dmg)
		}
			
		if(weapon == CSW_AK47 && random_num(1, 6) == 1) // 1/6 z ak
			cod_inflict_damage(idattacker, this, float(get_user_health(this)), 0.0, idinflictor, damagebits);	
	
		if(weapon == CSW_DEAGLE && random_num(1, 6) == 1) //1/6 z dgl
			cod_inflict_damage(idattacker, this, float(get_user_health(this)), 0.0, idinflictor, damagebits);		
		
		return HAM_HANDLED;
	}
	
	else if(damagebits & DMG_HEGRENADE) //dmg z granatu
	{
           cod_inflict_damage(idattacker, this, float(get_user_health(this)), 0.0, idinflictor, damagebits);
	}
	
	return HAM_IGNORED;
	
}

A teraz? Można spróbować metody "na lampkę",


  • +
  • -
  • 0

#9 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 454
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 27.06.2014 11:56


1/x działa poprawnie ale tak jak wspominałem Ci kiedyś na PW, ponownie występuję to, że gdy zabiję kogoś 1/x to wtedy wyskakuje taki znaczek jak choćby przy samobójstwie

No niestet yo jest wada ham'a ale mozna to obejść

 


kolejny problem a mianowicie można zabić swojego gdy strzelisz do niego to wykonuje się na nim samobójstwo tak jakby był włączony FF.

Ja z wyłaczonym ff nigdy z tym problemów nie miałem

 


Kolejna sprawa 1/1 z Granatu nadal nie działa, więc to Twoje 100% odnosi się tylko do tego, że wprowadziliśmy teraz totalny mord haha

Nigdy nie tstowałem tego sposobu ale już daję działający

 

35131 co w twoim sposobie jest złe:

• nie sprawdzasz czy osoba której zadajemy dmg żyje a mogła zginąć a wtedy cała funkcja zwiększania dmg nie ma sensu

• za każdym razem jak sprawdzasz broń robisz to za pomocą instrukcji if a nie używasz else if (taki bardziej programistyczny błąd)

• polecam [function=random] a nie [function=random_num] wydajniejsze ale to jest tylko moje widzimisię

• za pomocą [function=SetHamParamFloat] ustawiasz komuś dmg równe jego hp (takie pseudo 1/x) a musisz pamiętać że ta funkcja jest kompatyblina z innymi pluginami tzn. inny plugin może wychwycić zmienioną wartość i sprawić by to już gracza nie zabiło

• używasz [function=cod_inflict_damage] do dodawania dmg a to jest mega zły sposób!!! Dlaczego? dlatego że nikt nie może ingerować w dmg zadane za pomocą tej funkcji jak nie rozumiesz to dam ci przykład:

- w pluginie A dajesz graczu X dodatkowe dmg (z all) za pomocą tej funkcji hmm jakieś 5 dmg

- w pluginie B dajesz graczu Y umiejętnośc iż strzały w plecy nie zadają dmg

 

Teraz jak gracz X strzeli do gracza Y w polecy to podstawowe dmg się zablokuje a to 5 dodane nie!!! Gdyż na nie wpłynąć nie możemy

 

Dodatkowo ty do dmg gracza (standardowego) dodajesz dmg (w tej samej ilości) + 3 + 0.5*int

Tzn. Dajesz graczy 2*dmg +3 +0.5*int a napisałeś tak:

 


dodatkowe dmg (+3) i mnoznik inteligencji (2 pkt = 1 dmg)

Jak bys tam zmiennej damage nie umieścił to by było okey ale umieściłeś!

 

 

 

Nie mam już zbytnio czasu na komentowanie dlatego masz tu kodzik pięknie opisany biggrin.png

#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>

new HeModelIndex

const m_bitsDamageType = 76
const m_LastHitGroup = 75

public plugin_init()
{
	register_plugin("Tak sie zabija graczy!!!", "", "BlackPerfum(Zjem ci Noge)")
	RegisterHam(Ham_TakeDamage, "player", "TakeDamage",1)		//Rejestruje momęt zadania dmg graczu
	//Jeśli chcesz robic tu tylko 1/x to najlepiej pre (4 arg == 0) :D
	
	register_message(get_user_msgid("DeathMsg"),"DeathMsg")
	
	HeModelIndex = engfunc(EngFunc_ModelIndex,"models/w_hegrenade.mdl")
	//Zapisuje sobie id modelu granata
}

public DeathMsg(MsgId,MsgDest,id)
{
	new vid = get_msg_arg_int(2)	//Zapisuje arg. nr. 2 w zmiennej vid (arg. 2 == osoba zabita)
	new kid = get_msg_arg_int(1)	//Zapisuje arg. nr. 1 w zmiennej vid (arg. 1 == osoba zabijająca)
	static WeaponName[32]
	get_msg_arg_string(4,WeaponName,31)
	if(WeaponName[0] == 'w' && is_user_connected(vid) && 0 < kid < 33 && vid != kid)
	{
		new body,dmgbits
		body = get_pdata_int(vid,m_LastHitGroup,5)
		dmgbits = get_pdata_int(vid,m_bitsDamageType,5)
		
		if(body == HIT_HEAD)	set_msg_arg_int(3,get_msg_argtype(3),1)
		if(dmgbits & DMG_BULLET && is_user_alive(kid))
		{
			get_weaponname(get_user_weapon(kid),WeaponName,31)
			set_msg_arg_string(4,WeaponName[7])
		}
		else if(dmgbits & 1<<24)	set_msg_arg_string(4,"grenade")
	}
}

public TakeDamage(id, ent, attacker, Float:damage, damagebits)
{
	if(!is_user_connected(attacker) || !is_user_alive(id) || id == attacker)	return HAM_IGNORED
	// Sprawdzam czy osoba zadająca dmg jest graczem (+ czy jest na serwie)
	// Sprawdzam też czy osobę otrzymującą dmg nie zabił jakiś inny plugin
	// Sprawdzam czy ktoś nie zadał sam sobie dmg
	// Sprawdzam czy ma klase
	// Zakładam że na serwerze jest wyłączone friendlyfire bo niece mi się tego sprawdzać xD
	
	static Float:OldDamage
	OldDamage = damage //Przyda się przy zmianie dmg xD
	
	if(ent == attacker)// Porównuje byt zadający dmg z bytem gracza 
	{	
		//(tzn. warunek spełni się gdy to gracz zada dmg bezpośrednio czyli nie za pomocą he lub innych bytów)
		if(damagebits & DMG_BULLET)
		{	
			//Na wszelki wypadek możemy sprawdzić czy to na pewno broń zadaje dmg
		
			// Jeśli żaden plugin nie zabił atakującego to jest nie możliwym by nie żył dlatego spokojnie można pobrać jego broń
			switch(get_user_weapon(attacker))	//Sprawdzam aktualną broń atakującego
			{
				case CSW_M4A1:
				{
					//Jeśli to m4
					if(!random(6))
					{
						//I jeśli atakującemu się poszczęściło gdyż ma tylko 16,(6)%
						//(1/6(ta szóstka jest tą z random)*100% = 16,(6)%)
						//To zabijam trafionego ale robie to tak by pluginy mogły to wychwycić
						KillPlayer(id,attacker,damagebits) //Gracz zabity i koniec ciężkich zmagań z zadawaniem dmg
					}
					else
					{
						/*
						//Ale nie uważamy że klasa nadal jest za słaba
						//To dodajmy jej 20 dmg uwzględniając int
						damage += 20.0+float(cod_get_user_intelligence(attacker,1,1,1))//Czynnik_Inteligencji
						//Czynnik inteligencji podmieniasz dowolną liczbą
						//Czynnik inteligencji sobie robisz jaki ci się żywnie podoba xD
						//Czynnik inteligencji to jest dokładnie to samo co:
						//cod_inflict_damage(attacker, id, damage+20.0, Czynnik_Inteligencji, ent, damagebits)
						//Np. jak gracz ma 100 inta i ustawisz czynnik inteligencji na 0.2 to doda do dmg
						//te 20 dmg+100(int)/(1/0.2 == 5) == 100/5=25 końcowe dmg == damage+20(standardowe)+25(od inta)
						*/
					}
				}
				case CSW_AK47:	if(!random(6))	KillPlayer(id,attacker,damagebits)//To samo co wyżej tylko bez komentarzy
				case CSW_USP:	if(!random(6))	KillPlayer(id,attacker,damagebits)
				// Użyłem case byś mógł łatwo dodawać sobie bronie gdyż widziałem że ich tam parę masz
				// Pamiętaj w tym warunku nie złapiesz zadanie dmg przez he, lub inne byty niż gracz(i bronie palne+nóż)
			}
		}
	}
	else
	{
		// Tutaj można się pokwapić o złapanie zadania dmg he
		// pobieranie broni nam tu nie pomoże gdyz gracz wyrzucił he i ma coś innego w łapie 
		// chyba że miał ich parę i nie zmienił broni ale nam to pomocne nie będzie gdyż szansa na to jest równa 1 na 1/0
		// Można pobrać classname ent'a zadającego dmg i porównać go do "weapon_hegranade" ale nie lubimy zbyt często porównywać string'ów
		// Dlatego z pomocą przychodzi nam fakemeta
		// Spróbujmy pobrać id broni ale nie bytu
		//Ale najpierw trzeba sprawdzić czy byt przechowuje jakieś dane (nie lubimy błędów w konsoli)
		if(pev_valid(ent) == 2)
		{
			//Czyli jeśli byt przechowuje dane
			//To pobierami jego id modelu 
			//I porównujemy z tym pobranym wcześniej
			if(pev(ent,pev_modelindex) == HeModelIndex)//A zatem jeśli byt zadający dmg to he
			{
				//To zabijam gracza
				KillPlayer(id,attacker,damagebits) // I to wszystko
			}
		}
	}
	//Teraz sprawdźmy czy zmieniliśmy końcowe dmg:
	if(damage != OldDamage)
	{
		//Jesli zmieniliśmy to trzeba wysłać zmienione dmg + prawowićie zakończyć funkcję
		SetHamParamFloat(4,damage)
		return HAM_HANDLED
	}
	//Jeśli dmg nie zostało zmienione to metamod spokojnie może zlekceważyć tą funkcję :D
	return HAM_IGNORED
}

KillPlayer(id,attacker,damagebits)
{
	set_pdata_int(id,m_bitsDamageType,damagebits)
	ExecuteHamB(Ham_Killed, id, attacker, 1)
}

Kompatybilne + Normalne napisy w deatch message


  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#10 TibacK

    Diler pod gimnazjum dla niepełnosprawnych dzieci

  • Power User

Reputacja: 487
Wszechobecny

  • Postów:2513
Online

Napisano 27.06.2014 12:49

Dobra, juz sie nie odzywam.

Ja zawsze uzywam damage z CoD. Moze dlatego ze nie mam innych pluginów modyfikujacych obrazenia...

Tak czy siak. Ale 1/x z he da sie w takedamage zrobic czy nie?
  • +
  • -
  • 0

#11 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 454
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 27.06.2014 13:24

Dobra, juz sie nie odzywam

Odzywaj się biggrin.png Lubie jak coś mówisz. Tylko czasem robisz głupie rzeczy (z resztą ja też)

 

Ja zawsze uzywam damage z CoD. Moze dlatego ze nie mam innych pluginów modyfikujacych obrazenia...

Alez uzywasz np. perki na dmg / klasy na dmg wszystko co modyfikuje/zadaje dmg nie ważne czy jest z paczki cod czy nie sad.png
 
 
 

Tak czy siak. Ale 1/x z he da sie w takedamage zrobic czy nie?

Sposób pokazany wyżej to właśnie robi a nawet sprawia że poprawnie wyskakuje ikonka w prawym górnym rogu o śmierci biggrin.png
Nie używam damagebits do sprawdzania czy to he bo nie raz natknąłem sie z tym że jakis byt zadaje ten sam typ dmg


Użytkownik BlackPerfum edytował ten post 27.06.2014 13:26

  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#12 TibacK

    Diler pod gimnazjum dla niepełnosprawnych dzieci

  • Power User

Reputacja: 487
Wszechobecny

  • Postów:2513
Online

Napisano 27.06.2014 13:31

A jednak napisze cos....

Nie rozumiem dlaczego mam nie uzywac cod_inflict_damage().

Chodzi o to ze np. Klasa ma dodatkowe dmg i w tym samym momencie posiada perk na dodatkowe dmg?
  • +
  • -
  • 0

#13 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 454
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 27.06.2014 14:21   Najlepsza odpowiedź

Nie rozumiem dlaczego mam nie uzywac cod_inflict_damage().

Już tłumaczę:
 
Funkcja cod_inflict_damage to nic innego niż:

ExecuteHam(Ham_TakeDamage,id,ent,attacker,Float:damage,damagebits)

Tylko dodatkowo w dmg może zostać uwzgledniony pewien procent int'a gracza. Jeśli to hamsandwich zadaje dmg to co jest złe?? A to że używasz ExecuteHam a nie ExecuteHamB różnica ogromna choć pozornie mała. Dodanie na samym końcu nazwy funkcji "B" sprawi  iż tą funkcję będą mogły złapać inne pluginy. Tzn. tak jak mówiłem wyżej. Grasz klasą np. Szturmowiec która ma dodatkowe 10 dmg z m4(dodane twoim sposobem). a jakis gracz w przeciwnym teamie gra klasa AntySzturmowiec która posiada w evencie ham_takeDamage blokuje wszystkie dmg z m4. W pewnym momęcie strzelacie do siebie (twoja bron to m4)  i o dziwo zadajesz mu dmg!!! Bo on nie był w stanie satrzymać tego dodatkowego dmg! Dlatego udało ci się go zabić biggrin.png
Przykład w którym widac że dmg zadawane tym sposobem nie mozna modyfikować (za pomocą hamsandwich'a)
 
Wniosek: Jeśli zmodyfikujesz swojego cod'a i dodasz tam "B" to możesz używać tej funkcji to zadawania dmg. Nadal nie możesz używać jej do zwiększenia dmg. Dlaczego?? Bo jak za pomocą jej zwiększysz dmg == ∞ (wtf? moja nieskończonośc zmalała :( )
Dlaczego? Bo wykonujesz pętle nieskończoną. Zadając komuś dmg (normalnie pistoletem) sprawiasz że wykonuje się funkcja zarejestrowana w ham'ie nastepnie dodajesz w ten sposób dmg co sprawia że znowu ta funkcja się wykonuje i znowu dodajesz dmg i znowu...

 

 

Jak modyfikować dmg?

Według mnie najlepiej robic to tak:

 

W Ham_TakeDamage (pre) dodawać / odejmować dmg (za pomocą SetHamParmFloat)

Mozna także tutaj zrobić blokowanie dmg za pomoca zwrócenia supercode a także można tu robic 1/x za pomocą Ham_Killed

 

W Ham TakeDamage (post) mnożyć / dzielić dmg  (za pomocą SetHamParmFloat) oraz dopiero tutaj pytać się jakie gracz zadał dmg. tzn. dopiero tutaj np. zabierać wytrzymalośc przedmiotu (w zależności od dmg) albo dodawać expa (w zależności od dmg) dlaczego dopiero tutaj bo to jest dmg końcowe to dmg już nie podlega zmianie (a to w pre tak)

 

Tak naprawdę to by sie przydały trzy eventy:

- pierwszy na doddawanie/odejmowanie dmg

- drugi na mnożenie/dzielenie dmg

- i trzeci: pobieranie dmg i działanie nad nim ale nie zmienianie go

 

 

 


  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#14 TibacK

    Diler pod gimnazjum dla niepełnosprawnych dzieci

  • Power User

Reputacja: 487
Wszechobecny

  • Postów:2513
Online

Napisano 27.06.2014 14:59

Dobra. Czyli jak dodam ExecuteHamB to będę mogl zadawac dmg przez cod_inflicit_damage().

Ale nadal nie rozumiem dlaczego nie moge zwiekszac... Przeciez dodaje do dmg wartosc i zadaje te dmg.
Wytlumacz mi to mistrzu :)
  • +
  • -
  • 0

#15 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 454
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 27.06.2014 19:11

Zacznijmy od tego że jeśli już byś chciał dodać swoim sposobem komuś 10 dmg to tak:
cod_inflict_damage(attacker, id, 10.0, 0.0, ent, damagebits)
A nie tak:
cod_inflict_damage(attacker, id, damage+10.0, 0.0, ent, damagebits)
Bo podwoisz komuś dmg + dodasz osobno 10 dmg biggrin.png
 
 
Tłumacze ci kolejny raz. Dmg dodane przez cod_inflict_damage nie da się wychwycic za pomoca eventu Ham_TakeDamage (a na nim sie opiera 99% aktualnych pluginów modyfikujących dmg)
To znaczy jeśli użyjesz cod_inflict_damage to już dmg dodatkowego nie zmienisz a to jest mega wada!!! Ja bym na przykład chciał zrobić taką moc że przez 10 sek nie można mi w beret dmg zadać to ty i tak mi zadasz te dodatkowe dmg!!! Bo go nie jestem w stanie wychwycić za pomocą Ham_TakeDamage dlatego to jest szit!!! Poza tym po co w ogóle zadawać dodatkowe dmg jesli można zwiększyc stare?? Za pomocą SetHamParmFloat

Podam ci najbanalniejszy przykład dlaczego dmg tak się nie powinno dodawać. Możliwe że masz na serwerze plugin pokazujący zadane dmg bo jest dosyc popularny i nie trudno go nawet samemu zrobić. Ów plugin pokaże jedynie podstawowe dmg a juz tego dodanego za pomocą cod_inflict_damage nie!!!
  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#16 TibacK

    Diler pod gimnazjum dla niepełnosprawnych dzieci

  • Power User

Reputacja: 487
Wszechobecny

  • Postów:2513
Online

Napisano 27.06.2014 19:31

Czyli wszystkie cod_inflict_damage() w perkach musze zamienic SetHamParamFloat?

Pierwsza czesc posta rozumiem :)

a to dlatego zabijało gracza z tą dziwną ikonką.

A czy mozna jakos naprawic cod_inflict_damage()?
Dlaczego ich sie nie da wychwycic? Przeciez sa 'notowane' przez silnik bo gracz otrzymuje dmg.
  • +
  • -
  • 0

#17 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 454
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 27.06.2014 19:38

Czyli wszystkie cod_inflict_damage() w perkach musze zamienic SetHamParamFloat?

Wszystkie wykonywane w evencie Ham_TakeDamage i nie tylko w perkach

a to dlatego zabijało gracza z tą dziwną ikonką.

Tak

Dlaczego ich sie nie da wychwycic? Przeciez sa 'notowane' przez silnik bo gracz otrzymuje dmg.

Da się wychwycić ale nie wychwycisz poprzez Ham_TakeDamage :( A w nim nie wychwycisz bo używasz ExecuteHam a nie ExecuteHamB a dlaczego nie możesz użyć ExecuteHamB pisałem wcześniej

A czy mozna jakos naprawic cod_inflict_damage()?

Nie da się tego naprawić bo naprawa prowadzi do kolejnego błędu (do pętli nieskończonej opisanej wcześniej) dlatego powinno się używać SetHamParmFloat i zwracać HAM_HANDLED xD Aby wszystko pięknie śmigało
  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#18 TibacK

    Diler pod gimnazjum dla niepełnosprawnych dzieci

  • Power User

Reputacja: 487
Wszechobecny

  • Postów:2513
Online

Napisano 28.06.2014 07:24

Dobra. Rozjasniasz mi juz prawie wszystko.

1. Czy lepiej bedzie jak dam ExecuteHamB zamiast ExecuteHam? (wiem ze ani to ani to, ale chce sie dowiedziec czy chociaz w niewielkim stopniu pomoze)
2. Czy cod_inflict_damage() moge uzywac np. do zabicia gracza (dmg = jego hp) (rozwaz przypadek z ExecuteHamB i ExecuteHam - chodzi o Ham_Killed)? Czy lepiej uzyc ExecuteHamB i go zabic tak 'naturalnie'?
3. Do 1/x z broni uzywac Ham_TakeDamage Pre czy Post ?
4. A czy jezeli do sprawdzania czy to granat uzywam damagebits to bedzie to poprawne? Pomijam fakt ze inny byt moze zadac ten typ dmg.

Proszę Cię o dokładne wyjaśnienie.
  • +
  • -
  • 0

#19 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 454
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 28.06.2014 07:48

1. Czy lepiej bedzie jak dam ExecuteHamB zamiast ExecuteHam? (wiem ze ani to ani to, ale chce sie dowiedziec)

Tak ale musisz pamiętać by pozmieniac we wszystkich pluginach aby cod_inflict_damage nie dodawała dmg w evencie Ham_TakeDamage

2. Czy cod_inflict_damage() moge uzywac np. do zabicia gracza (dmg = jego hp)?

Nie! I to z paru powodów zacznijmy w przypadku gdy masz ustawione ExecuteHamB:
• Błąd ogółem jest tylko 1 tworzenie pętli nieskończonej (jeśli zabijesz w Ham_TakeDamage)!!! Nie ważne czy dodasz 5 dmg czy dodasz 999dmg to i tak ją zrobisz :( A pętla nieskończona == Crash
• A zabijanie nie w Ham_TakeDamage także ma swoje wady gdyż inny plugin może zmodyfikować dmg i już gracza nie zabijesz :( Tylko zadasz mu parę dmg

Teraz ExecuteHam:
• Jeśli będziesz próbował zabić w Ham_TakeDamage to żadnej pętli nie zrobisz ale!!! Po pierwsze zadasz dmg potem zabijesz (a to jest niezbyt dobre wyjście bo to serwer ma kontrole nad twoim umieraniem a nie ty).
• Tego dmg nie można modyfikować w Ham_TakeDamage ale na milion innych sposobów da się!! dlatego ta funkcja także może sprawić iż nie zabijesz gracza a zadasz mu jedynie dmg :(


Wniosek: Żadną z tych opcji nie powinno się zabijać bo można nie zabić :(

3. Do 1/x z broni uzywac Ham_TakeDamage Pre czy Post ?

Osobiście polecam pre bo wolę by coś zabiło gracza niż serwer ma sie trudzić i mysleć w post nad przerabianiem dmg. Dlatego zawsze do tego pre używam choć użycie post nie jest złe ale może skutkować nie fajnymi efektami

Wnioski: Jeśli zostawisz w cod_inflict_damage ExecuteHam to zapomnij o zadawaniu nią dmg,i zabijaniu (bo zabijanie to nic innego niż zadanie dmg nią!!!) nie ważne w jakim miejscu
Lecz jeśli zmienisz na ExecuteHamB to spokojnie za jej pomocą możesz (a nawet powinieneś bo do tego została stworzona ta funkcja) zadawać dmg (nie dodawać lecz zadawać) tzn. np. jakiś ent ciebie udeży to za pomocą tej funkcji zabierasz dmg w 100% spokojnie ale także tej funkcji nie używasz do zabijania


Zatem czy zwiększać dmg?? Użyj SetHamParamFloat

Czy zabijać gracza Uzyj ExecuteHamB + Ham_Killed (najlepiej to użyj fixa jakiego podałem u góry aby wszystko było poprawnie wyświetlane)
  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#20 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 454
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 28.06.2014 11:50

4. A czy jezeli do sprawdzania czy to granat uzywam damagebits to bedzie to poprawne?

Tak jeśli:

Pomijam fakt ze inny byt moze zadac ten typ dmg.


  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika





Również z jednym lub większą ilością słów kluczowych: cod nowy

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

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