←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

[HamSandwich] Ham_Killed a zabicie z granata

  • +
  • -
ogieR8 - zdjęcie ogieR8 23.03.2017

Witam, wróciłem !

 

Analizując tematy:

https://amxx.pl/topi...na-obrażeniach/

oraz

https://amxx.pl/topi...brażenia/page-2

wiem jak działać w evencie ham_TakeDamage, ale naszło mnie coś kilka dni temu, wróciłem do Notepad'a i chciałbym to zrealizować - ale w kanapce. Załóżmy, że dla przykładu chciałbym zliczać zabójstwa z HE do zmiennej globalnej. Jak w evencie ham_Killed wykryć zabicie z granatu ? Nie ma tutaj parametru idinflictor etc. aby wykluczyć inne możliwości śmierci od podłączonego gracza.

 

Doszukałem się jedynie na allienach czegoś:

https://forums.allie...p/t-167351.html

ale rozwiązanie nawet ConnorMcLeod nie pomogły.

 

Jakieś sugestie ?

 

Pozdrawiam,

Mariusz K.

Odpowiedz

  • +
  • -
_McHappy - zdjęcie _McHappy 23.03.2017

Z fakemetą (ze wspomnianego postu z allied'ów):

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

#define m_bitsDamageType 76
#define DMG_GRENADE (1<<24)
#define DMG_BULLET (1<<1)

public plugin_init() 
{
	register_plugin("HamKilled Test","1.0","...");
	
	RegisterHam(Ham_Killed, "player", "HamKilled");
}


public HamKilled(iVictim, iAttacker, shouldgib) 
{
	give_item(iAttacker, "weapon_hegrenade"); //W celu szybkich testow
	
	if ( get_pdata_int( iVictim , m_bitsDamageType ) & DMG_BULLET ) 
		return HAM_IGNORED;
		
	if ( get_pdata_int( iVictim , m_bitsDamageType ) & DMG_GRENADE ) 
		client_print(0, 3, "Zabicie z granata...");
		
	return HAM_IGNORED;
} 

Jak wspomniał Bugsy, metoda powyżej działa, ale jak też wspomniał ( :D) Connor, bity typów obrażeń się sumują.

Podczas testów, zauważyłem, iż sumują się tylko w sytuacji gdy następuje zabicie z broni palnej (gracz ma ustawione bity obrażeń DMG_GRENADE | DMG_BULLET).

W sytuacji śmierci od obrażeń granata, wszystko jest ustawione prawidłowo.

Nie wiem do końca, jak jest z innymi bitami obrażeń, musiałbyś sprawdzić, żeby uniknąć niespodzianek.

Potestuj powyższy kod i zobacz, czy o to Ci chodziło.


Użytkownik _McHappy edytował ten post 23.03.2017 11:18
Odpowiedz

  • +
  • -
rzeznik9871 - zdjęcie rzeznik9871 23.03.2017

hmm ale czemu musi to byc w kanapce? przeciez duzo latwiej zrobic to w deathmsg

Odpowiedz

  • +
  • -
ogieR8 - zdjęcie ogieR8 26.03.2017

I jeden i drugi ma rację, wiem.. niestety zależy mi na granacie co prawda, ale nie tylko, bity faktycznie sumuje i gdy strzelaliśmy do kolesia z kałasza i zabiliśmy go granatem, kod wrzuca zabójstwo i do tej.. i do tej broni :D

 

Poddając się skorzystałem z rady rzeznika, chociaż bardzo chciałem tego uniknąć i ostatecznie w client_death to puściłem. Temat można zamknąć, chyba że ktoś coś poczaruje jeszcze. :D + poleciały

Odpowiedz

  • +
  • -
_McHappy - zdjęcie _McHappy 26.03.2017

Mam coś takiego (w kanapce), ale tak jak wspomniałem, nie jestem pewien co do flag innych niż zabicie z broni palnej.

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

#define m_bitsDamageType 76

#define DMG_BULLET (1<<1)
#define DMG_GRENADE (1<<24)

public plugin_init() 
{
	register_plugin("HamKilled Test", "1.0", "...");
	
	RegisterHam(Ham_Killed, "player", "HamKilled");
}


public HamKilled(iVictim, iAttacker, shouldgib) 
{
	give_item(iAttacker, "weapon_hegrenade"); //W celach szybkich testow
	
	if (!(get_pdata_int(iVictim , m_bitsDamageType) & DMG_BULLET) && get_pdata_int(iVictim , m_bitsDamageType) & DMG_GRENADE)
	{
		client_print(0, 3, "Zabicie z granata...");
	}
	else
	{
		new weapon_name[16];
		new wid = get_user_weapon(iAttacker);
		get_weaponname(wid, weapon_name, charsmax(weapon_name));
		
		client_print(0, 3, "Zabicie z %s...", weapon_name);
	}
	
	return HAM_IGNORED;
} 
Odpowiedz