←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

CoD Nowy
Problem 1/x z broni nie działa poprawnie

Zablokowany

  • +
  • -
ex0 - zdjęcie ex0 10.06.2014

Witam, jak w temacie.
Od dnia wczorajszego zaobserwowałem dziwne zjawisko, a mianowicie stosując funkcję

 

if(weapon == CSW_HEGRENADE && damage > 20.0)
			cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits);

Nie otrzymujemy 1/1 na zabicie jak powinno być a raczej różne rodzaje DMG.

Poczynając od 700 (Jeżeli mamy w granicach 1000 hp) do nawet 3700 (Jeżeli mamy w granicach 4500 hp)

 

Czyli jak widać funkcja niezbyt poprawnie działa, dodatkowo tylko pierwszy strzał jest tak mocny, a pozostałe już są standardowe, zwiększone zgodnie z DMG klasy lub zmniejszone odpowiednio do tego co pisałem na górze czyli wartości pozostałego HP u gracza przeciwnego.

następną sprawą jest, że kompletnie nie działa mi (bynajmniej tak mi się zdaje, lub działa tak jak to powyżej) 1/x z danej broni

if(weapon == CSW_M4A1 && damage > 20.0 && random_num(1,6) == 1) 
			cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits);

Przykładowo to.

A cała funkcja wygląda u mnie tak:

 

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)
			cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits);
	
		if(weapon == CSW_M4A1 && damage > 20.0 && random_num(1,6) == 1) 
			cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits);
			
		if(weapon == CSW_AK47 && damage > 20.0 && random_num(1,6) == 1) 
			cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits);	
	
		if(weapon == CSW_DEAGLE && damage > 20.0 && random_num(1,6) == 1) 
			cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits);				
	
		if(get_user_team(this) != get_user_team(idattacker) && get_user_weapon(idattacker) == CSW_M4A1 && damagebits & DMG_BULLET)
			cod_inflict_damage(idattacker, this, 100.0, 1.0, idinflictor, damagebits);
	}
	
	return HAM_IGNORED;
	
}

Zdziwiło mnie to, lecz kolega dla faktu 1/1 stwierdził, że lepszym rozwiązaniem będzie użycie

SetParamFloat

Więc zastosowałem to tak:

 

 if(weapon == CSW_KNIFE && damage > 20.0) {
       SetParamFloat(4, get_user_health(this))

I tutaj ku mojemu ogromnemu zdziwieniu ....

 

publicTakeDamage(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_KNIFE && damage > 20.0) {
       SetParamFloat(4, get_user_health(this))


	return HAM_HANDLED;
        }
   }
		return HAM_IGNORED
}

Tak wygląda funkcja, a mianowicie w oczy rzuca się dla mnie to :

 

publicTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)

Jak widać bez zastosowanej spacji, wtedy nie wyskakują errory z niezdefiniowanym symbolem (już nie pamiętam jakim), natomiast po oddzieleniu spacją wyskakuje własnie takowy error.
A tak to tutaj tylko warrning wyskakuje, że symbol nie jest (był) nigdzie używany(użyty).

 

Czy ktoś mi może odpowiedzieć co tutaj mogłoby szlag trafić i nie działać?
Ponieważ to bardzo irytujące ;>

 

Ogólnie podstawy jak:

 

#define DMG_BULLET (1<<1)

RegisterHam(Ham_TakeDamage, "player", "TakeDamage");

są zawarte w kodzie.

Jakieś pomysły? :google:

Odpowiedz

  • +
  • -
ex0 - zdjęcie ex0 12.06.2014

if(weapon == CSW_HEGRENADE && damage > 20.0)

Zmień na:

if(damagebits & (1<<24))

Przy broniach zrób tak:

if(weapon == CSW_M4A1 && damagebits & DMG_BULLET && random_num(1,6) == 1) 

Ogólnie mistrzu to nie pykło . :<

Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 12.06.2014

Proszę wszystko jasno opisane:

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

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
}

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 naserwie)
	// Sprawdzam też czy osobę otrzymującą dmg nie zabił jakiś inny plugin
	// Sprawdzam czy ktoś nie zadał sam sobie dmg
	
	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)
		// Jeśli żaden plugin nie zabił atakującego to jest nie możliwym by nie żył dlatego spokojnie można pobrać jego broń
		new weapon = get_user_weapon(attacker) 
		switch(weapon)	//Sprawdzam aktualną broń atakującego
		{
			case CSW_KNIFE:
			{
				//Jeśli to nóż
				if(!random(8))
				{
					//I jeśli atakującemu się poszczęściło gdyż ma tylko 12,5% (1/8(ta ósemka jest tą z random)*100% = 12,5%)
					//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
				}
			}
			// 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
		new weapon = get_pdata_int(ent,43,4) 
		// Tylko nwm czy wartość zostanie poprawnie pobrana gdy byt nie będzie bronią ale 
		// zawsze możesz użyć "damagebits" choć często pluginy używają go w nie konfortowy sposób
		// Czyli masz conajmniej dwa sposoby czy byt to he
		// Nr.1
		if(weapon == CSW_HEGRENADE)
		//Nr.2
		if(damagebits & (1<<24))
		
		//Osobiście użył bym pierwszego (ale najpierw sprawdził jak zachowuje się na byty które nie są brońmi) ale z mojej niewiedzy użyję sposobu nr.2
		if(damagebits & (1<<24))//A zatem jeśli byt zadający dmg to he
		{
			if(!random(2))
			{
				//I jeśli Została wylosowana liczba 0 (możliwe liczby do wylosowania: 0,1 tzn. 50% na liczbę 0)
				//To zabijam gracza
				ExecuteHamB(Ham_Killed, id, attacker, 1) // I to wszystko
			}
		}
	}
}
Odpowiedz

  • +
  • -
Najlepsza odpowiedź ex0 - zdjęcie ex0 12.06.2014

Wielkie dzięki panu.
Bardzo jasno czytelnie i dobrze opisane.

Browara bym postawił, ale kolega nie z okolic :/

Odpowiedz
Zablokowany