Урон по одному союзнику

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
Заинтересовался в нанесении урона не по всем союзникам, а только по одному. Т.е. все могут бить одного союзника, а он может бить их всех. Толпа бить друг друга не может, только одного :D

Хотелось бы узнать варианты реализации подобного. Кому не жалко поделиться :D
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
варианты реализации подобного
mp_friendlyfire 1
Определяешь индекс "особенного" игрока и просто проверяешь урон относительно него.
Если событием хукнул, то просто возвращаешь всем союзникам HP, когда бьют не его.
Если SDHook, то просто блокируешь такой же урон.
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
EPacker2, скорее, чтобы люди искали кого забить до смерти
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Урон по одному союзнику, а он - по всем

чтобы люди искали кого забить до смерти
Если ещё не нашлось хорошего варианта:
PHP:
#define ANTIFRIEND_INDEX 1

public OnPluginStart() HookEvent("player_hurt", Event_PlayerHurt);

public Event_PlayerHurt(Handle:event, String:name[], bool:dontBroadcast)
{
	new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
	if(attacker && attacker != ANTIFRIEND_INDEX)
	{
		new client = GetClientOfUserId(GetEventInt(event, "userid"));
		if(attacker != client && client != ANTIFRIEND_INDEX && GetClientTeam(attacker) == GetClientTeam(client))
		{
			SetEntProp(client, Prop_Send, "m_iHealth", GetEventInt(event, "dmg_health")+GetEventInt(event, "health"));
		}
	}
}
mp_friendlyfire 1 не забывываем.
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,336
Re: Урон по одному союзнику, а он - по всем

Если ещё не нашлось хорошего варианта:
PHP:
#define ANTIFRIEND_INDEX 1

public OnPluginStart() HookEvent("player_hurt", Event_PlayerHurt);

public Event_PlayerHurt(Handle:event, String:name[], bool:dontBroadcast)
{
	new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
	if(attacker && attacker != ANTIFRIEND_INDEX)
	{
		new client = GetClientOfUserId(GetEventInt(event, "userid"));
		if(attacker != client && client != ANTIFRIEND_INDEX && GetClientTeam(attacker) == GetClientTeam(client))
		{
			SetEntProp(client, Prop_Send, "m_iHealth", GetEventInt(event, "dmg_health")+GetEventInt(event, "health"));
		}
	}
}
mp_friendlyfire 1 не забывываем.

EventHookMode_Pre для такого обязателен. Иначе попадание в голову (или нанесение урона больше, чем есть у человека) = смерть. К тому же каждый раунд один и тот же игрок будет этой целью. Как только он покинет сервер, не будет игрока, в которого можно стрелять. Всё же стоит определить этот индекс глобально и выбирать его случайным каждый раунд.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #7
AlmazON, не лучше ли через sdkhooks ?

Reiko1231, индекс он написал просто для примера. ТС сам уже подстроит
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
EventHookMode_Pre для такого обязателен
Сначала вызывается событие урона, а уже позже - смерти. Так что, данное событие просто переустановит HP - должно быть нормально.
Пользовался как-то - вроде никто не умирал.
не лучше ли через sdkhooks
Лучше, но там расписывать побольше) Я больше пример привёл, собственно проверок, для достижения эффекта. А чем и как - дело личное.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #9
Re: Урон по одному союзнику, а он - по всем

PHP:
#define ANTIFRIEND_INDEX 1

public OnClientPutInServer(iClient)
{
	SDKHook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action:OnTakeDamage(iClient, &iAttacker, &inflictor, &Float:damage, &damagetype)
{
	if(iAttacker && iAttacker != ANTIFRIEND_INDEX && iAttacker != iClient && iClient != ANTIFRIEND_INDEX && GetClientTeam(iAttacker) == GetClientTeam(iClient))
	{
		damage = 0.0;
		return Plugin_Changed;
	}

}

Или просто return Plugin_Handled;
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Или просто return Plugin_Handled;
Не так. Раз уж взялся расписывать, то хукаем только участников нужной команды. Поскольку среди них и есть нужные атакующие, так и сама жертва. А раз оба типа этих индексов присутствует, то должно работать и без глобального хука. Оффтоп
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #11
AlmazON, если для игрока не хуункуто то он будет 0.
Следовательно ты не узнаешь он упал или его ранили из чужой команды.

Лучше лишний раз проверить
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
ты не узнаешь он упал или его ранили из чужой команды
Разве атакующий тогда не будет 0? Он то в проверке так и остаётся (ты же оставил) - мир то поэтому и не хукается.
 
Сверху Снизу