←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

[ROZWIĄZANE] Gracza o danym ID można zabić...


Najlepsza odpowiedź Gość_21977_* 20.05.2014 17:35

RegisterHam(Ham_TraceAttack, "player", "Ham_TraceAttack_playerPre", 0);
public Ham_TraceAttack_playerPre(
	vid,			// victim id	// ofiara (moze nie byc graczem)
	id,			// id		// zabojca (jest graczem (klasa "player" przy RegisterHam)
	Float:damage,				// obrazenia
	Float:dir[3],				// wektor ataku
	tr,					// trace result
	damagebits
){
	if(
			is_user_alive(vid)			// czy gracz żyje
//		&&	WARUNEK					// vid == 
		&&	damagebits & DMG_BULLET			// czy obrażenia zadane pocikiem
		&&	get_tr2(tr, TR_iHitgroup) != HIT_HEAD	// czy miejsce uderzenia to głowa
	){
		SetHamParamFloat(3, 0.0);			// zmieniamy wartość obrażeń na 0
		return HAM_HANDLED;				// HANDLED!
	}
	
	return HAM_IGNORED;
}

Edit.

damagebits & DMG_BULLET
jest istotne z uwagi na możliwość zadania obrażeń "w głowę" przez upadek, kolizję, granat a nawet wybuchającą bombę (niestety, ale doświadczenie wymaga, by ten warunek dodać, dlatego szynka wydaje mi się tutaj lepszym rozwiązaniem). Przejdź do postu
Zablokowany

  • +
  • -
szelbi - zdjęcie szelbi 20.05.2014

Tak jak w temacie. Szukam funkcji, która umożliwi ustawienie, że gracza o danym ID można zabić tylko w głowę. Próbowałem już dwóch sposobów, ale żaden z nich nie działał. Z góry dzięki za pomoc.

Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 20.05.2014

Zabić czy zadac obrażenia to jest duża różnica? Bo mozna kogoś ubić by miał 1 hp (uderzając nie w głowę) ale go nie zabijać

Odpowiedz

  • +
  • -
szelbi - zdjęcie szelbi 20.05.2014

Nie można zadawać obrażeń ani zabić gracza w inną część ciała niż głowa.

Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 20.05.2014

Czyli najzwyklejsze wyeliminowanie dmg. Nic prostszego.

public plugin_init()
{
/*
.
.
.*/
    register_forward(FM_TraceLine,"Tr");
}


public Tr(Float:Start[3],Float:End[3],IM,id,tr)
{
    if(!is_user_alive(id) || ~pev(id,pev_button) & IN_ATTACK)	return FMRES_IGNORED;
	
    if(get_tr2(tr, TR_iHitgroup) != HIT_HEAD)	return FMRES_SUPERCEDE
	
    return FMRES_IGNORED;
}

Nigdy tym zbytnio się nie bawiłem bo nie miałem powodów ale raczej działa

Odpowiedz

Najlepsza odpowiedź Gość_21977_* 20.05.2014

RegisterHam(Ham_TraceAttack, "player", "Ham_TraceAttack_playerPre", 0);
public Ham_TraceAttack_playerPre(
	vid,			// victim id	// ofiara (moze nie byc graczem)
	id,			// id		// zabojca (jest graczem (klasa "player" przy RegisterHam)
	Float:damage,				// obrazenia
	Float:dir[3],				// wektor ataku
	tr,					// trace result
	damagebits
){
	if(
			is_user_alive(vid)			// czy gracz żyje
//		&&	WARUNEK					// vid == 
		&&	damagebits & DMG_BULLET			// czy obrażenia zadane pocikiem
		&&	get_tr2(tr, TR_iHitgroup) != HIT_HEAD	// czy miejsce uderzenia to głowa
	){
		SetHamParamFloat(3, 0.0);			// zmieniamy wartość obrażeń na 0
		return HAM_HANDLED;				// HANDLED!
	}
	
	return HAM_IGNORED;
}

Edit.

damagebits & DMG_BULLET
jest istotne z uwagi na możliwość zadania obrażeń "w głowę" przez upadek, kolizję, granat a nawet wybuchającą bombę (niestety, ale doświadczenie wymaga, by ten warunek dodać, dlatego szynka wydaje mi się tutaj lepszym rozwiązaniem).
Użytkownik 21977 edytował ten post 20.05.2014 17:39
Odpowiedz
Zablokowany