Изменить дамаг

semjef

semjef.ru
Сообщения
993
Реакции
444
такой вопрос: как изменить дамаг наносимый одним игроком другому?

Вот что я попытался сделать через sdkhooks:
PHP:
#pragma semicolon 1

#include <sdkhooks>

public OnClientPostAdminCheck(client)
{
	SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action:OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
	if (AuraAuth[attacker])
	{
		if (auradamage[attacker] != 0)
		{
			new victimhealth = GetClientHealth(victim);
			new newdamage; 
			new String:s_damage[256];
			FloatToString(damage, s_damage, 256);
			new i_damage = StringToInt(s_damage);
			if(auradamagemode[attacker] == 0)
			{
				newdamage =	i_damage + auradamage[attacker];
			}	
			else
			{
				newdamage = i_damage + RoundToNearest(i_damage * 0.01 * auradamage[attacker]);
			}
			victimhealth -= newdamage;
			if(victimhealth < 1)
			{
				victimhealth = 0;
			}	
			SetEntityHealth(victim, victimhealth);
			return Plugin_Handled;
		}	
		return Plugin_Continue;
	}	
	else
	{
		return Plugin_Continue;
	}
}

получается так что игрок с повышенным дамагом не может убить другого, тому просто выставляет 0 хп.
а если игрок у которого нет этого повышеного дамага когонить коцает, сервер падает:DDD
 

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
такой вопрос: как изменить дамаг наносимый одним игроком другому?

Вот что я попытался сделать через sdkhooks:
PHP:
#pragma semicolon 1

#include <sdkhooks>

public OnClientPostAdminCheck(client)
{
	SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action:OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
	if (AuraAuth[attacker])
	{
		if (auradamage[attacker] != 0)
		{
			new victimhealth = GetClientHealth(victim);
			new newdamage; 
			new String:s_damage[256];
			FloatToString(damage, s_damage, 256);
			new i_damage = StringToInt(s_damage);
			if(auradamagemode[attacker] == 0)
			{
				newdamage =	i_damage + auradamage[attacker];
			}	
			else
			{
				newdamage = i_damage + RoundToNearest(i_damage * 0.01 * auradamage[attacker]);
			}
			victimhealth -= newdamage;
			if(victimhealth < 1)
			{
				victimhealth = 0;
			}	
			SetEntityHealth(victim, victimhealth);
			return Plugin_Handled;
		}	
		return Plugin_Continue;
	}	
	else
	{
		return Plugin_Continue;
	}
}

получается так что игрок с повышенным дамагом не может убить другого, тому просто выставляет 0 хп.
а если игрок у которого нет этого повышеного дамага когонить коцает, сервер падает:DDD

Самый лёгкий способ так это хукнуть player_hurt и через SetEntityHealth(); отнимать хп до нужного колличества, но если отнимается хп больше, чем есть у клиента, то ставь SetEntityHealth(client, 0); тогда автоматом создаётся евент player_death и кароч всё ок. Можно даже переменные евента не изменять.

И кстати, зачем при использовании СДК Хукс ты делал
PHP:
SetEntityHealth(victim, victimhealth);
Там ведь указано в параметрах &Float:damage, то-есть указатель на адрес переменной. Достаточно было переприсвоить и вернуть Plugin_Changed.
 
Последнее редактирование:

semjef

semjef.ru
Сообщения
993
Реакции
444
PHP:
public Player_Hurt(Handle:event, const String:name[], bool:dontBroadcast)
{
	new victim = GetClientOfUserId(GetEventInt(event, "userid"));
	new client = GetClientOfUserId(GetEventInt(event, "attacker"));
	if (AuraAuth[client] && auradamage[client] != 0)
	{
		new newdamage;
		new dmg = GetEventInt(event, "dmg_health");
		new hpvictim = GetEventInt(event, "health");
		if(auradamagemode[client] == 0)
		{
			newdamage =	auradamage[client];
		}	
		else
		{
			newdamage = RoundToNearest(dmg * 0.01 * auradamage[client]);
		}
		hpvictim -= newdamage;
		if(hpvictim < 1)
		{
			hpvictim = 0;
		}	
		SetEntityHealth(victim, hpvictim);
	}
}

когда атакует тот у кого повышен дамаг - всё супер, а когда тот у кого этого дамага нет - сервер падает((
 

S1deX

Скриптер ;)
Сообщения
129
Реакции
204
такой вопрос: как изменить дамаг наносимый одним игроком другому?

Вот что я попытался сделать через sdkhooks:
PHP:
#pragma semicolon 1

#include <sdkhooks>

public OnClientPostAdminCheck(client)
{
	SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action:OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
	if (AuraAuth[attacker])
	{
		if (auradamage[attacker] != 0)
		{
			new victimhealth = GetClientHealth(victim);
			new newdamage; 
			new String:s_damage[256];
			FloatToString(damage, s_damage, 256);
			new i_damage = StringToInt(s_damage);
			if(auradamagemode[attacker] == 0)
			{
				newdamage =	i_damage + auradamage[attacker];
			}	
			else
			{
				newdamage = i_damage + RoundToNearest(i_damage * 0.01 * auradamage[attacker]);
			}
			victimhealth -= newdamage;
			if(victimhealth < 1)
			{
				victimhealth = 0;
			}	
			SetEntityHealth(victim, victimhealth);
			return Plugin_Handled;
		}	
		return Plugin_Continue;
	}	
	else
	{
		return Plugin_Continue;
	}
}

получается так что игрок с повышенным дамагом не может убить другого, тому просто выставляет 0 хп.
а если игрок у которого нет этого повышеного дамага когонить коцает, сервер падает:DDD
Что это за код? O_O Просто ужас.
Так много лишних участков, ужас прямо.
PHP:
	new String:s_damage[256];
	FloatToString(damage, s_damage, 256);
	new i_damage = StringToInt(s_damage);
Вот это вообще уникально, приводить к целому типу используя перевод числа с плавающей точкой в строку и из строки в целое? Такого способа я еще не видел :D

Вот реализация через sdkhooks
PHP:
public OnClientPutInServer(client)
{
 SDKHook(client, SDKHook_OnTakeDamage, OnDamage);
}
public Action:OnDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
 if (attacker > 0 && attacker < MaxClients && AuraAuth[attacker] && auradamage[attacker]) {
  damage += (auradamagemode[attacker] == 0) ? auradamage[attacker] : RoundToNearest(damage * 0.01 * auradamage[attacker]);
  return Plugin_Changed;
 }
 return Plugin_Continue;
}
Не проверял, но должно работать.
 

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
PHP:
public Player_Hurt(Handle:event, const String:name[], bool:dontBroadcast)
{
	new victim = GetClientOfUserId(GetEventInt(event, "userid"));
	new client = GetClientOfUserId(GetEventInt(event, "attacker"));
	if (AuraAuth[client] && auradamage[client] != 0)
	{
		new newdamage;
		new dmg = GetEventInt(event, "dmg_health");
		new hpvictim = GetEventInt(event, "health");
		if(auradamagemode[client] == 0)
		{
			newdamage =	auradamage[client];
		}	
		else
		{
			newdamage = RoundToNearest(dmg * 0.01 * auradamage[client]);
		}
		hpvictim -= newdamage;
		if(hpvictim < 1)
		{
			hpvictim = 0;
		}	
		SetEntityHealth(victim, hpvictim);
	}
}

когда атакует тот у кого повышен дамаг - всё супер, а когда тот у кого этого дамага нет - сервер падает((

Евент - это уведомление, то-есть евент уже говорит о том, что хп у виктима уже отнялось, ты должен отнять "дополнительно".
PHP:
newdamage = RoundToNearest((dmg * 0.01 * auradamage[client]) - dmg);
И если хп меньше, чем колличество дамаги, то ставить хп 0, то-есть
PHP:
if(newdamage > hpvictim)
{
    SetEntityHealth(victim, 0);
}
else
{
    SetEntityHealth(victim, hpvictim - newdamage);
}

Пока писал ответ, S1deX уже тоже накалякал))
 

semjef

semjef.ru
Сообщения
993
Реакции
444
Игорь Охремчук, сервер падал при атаке того у кого нет дополнительного дамага, при том когда атачил человек с дамагом всё нормально.
 

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
Игорь Охремчук, сервер падал при атаке того у кого нет дополнительного дамага, при том когда атачил человек с дамагом всё нормально.

Ты ведь хп виктиму в минуса загонял)) Что ты ещё ожидал?:lol:
 

semjef

semjef.ru
Сообщения
993
Реакции
444
и new hpvictim = GetEventInt(event, "health"); помоему уже берёт то хп которое установилось игроку после попадания, разве нет?

Добавлено через 46 секунд
Ты ведь хп виктиму в минуса загонял


     
PHP:
 if(hpvictim < 1)  { 
            hpvictim = 0; 
        }

внимательнее...

Добавлено через 15 минут
S1deX, работает, но серв падает, ща попробую отдельным плагином это замутить, посмотрим что будет))
 
Последнее редактирование:

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
Ну да, проморгал. А ты уверен, что именно из-за этого сервер падает?
Я обоими вариантами делал и всё было ок.
 

semjef

semjef.ru
Сообщения
993
Реакции
444
сейчас запилил вот такое:

PHP:
#pragma semicolon 1

#include <sdkhooks>
#include <sourcemod>
#include <sdktools>
#include <cstrike>

public OnClientPostAdminCheck(client)
{
	SDKHook(client, SDKHook_OnTakeDamage, OnDamage);
}

public Action:OnDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
	if (attacker > 0 && attacker < MaxClients && !IsFakeClient(attacker)) 
	{
		damage += 1000;
		return Plugin_Changed;
	}
	return Plugin_Continue;
}

всё норм работает, никак не вылетает, сейчас буду дальше тестить))

Добавлено через 12 минут
отключил HookEvent("player_hurt", Player_Hurt); и всё заработало, походу конфликтили:D
 
Последнее редактирование:

semjef

semjef.ru
Сообщения
993
Реакции
444
ппц,
работает:
PHP:
public Action:OnDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
	if (attacker > 0 && attacker < MaxClients && AuraAuth[attacker] && auradamage[attacker]) 
	{
		damage += (auradamagemode[attacker] == 0) ? auradamage[attacker] : RoundToNearest(damage * 0.01 * auradamage[attacker]);
		return Plugin_Changed;
	}
	return Plugin_Continue;
}

не работает:
PHP:
public Action:OnDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
	if (attacker > 0 && attacker < MaxClients && AuraAuth[attacker] && auradamage[attacker]) 
	{
		damage += (auradamagemode[attacker] == 0) ? auradamage[attacker] : RoundToNearest(damage * 0.01 * auradamage[attacker]);
		return Plugin_Changed;
	}
	if (victim > 0 && victim < MaxClients && AuraAuth[victim] && TimerReghp[victim] == INVALID_HANDLE && regHealthclient[client])
	{
		TimerReghp[victim] = CreateTimer(RegenTimer[victim] , RegenHP, victim);
	}
	return Plugin_Continue;
}

Что за бред!?!?
 

S1deX

Скриптер ;)
Сообщения
129
Реакции
204
ппц,
работает:
PHP:
public Action:OnDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
	if (attacker > 0 && attacker < MaxClients && AuraAuth[attacker] && auradamage[attacker]) 
	{
		damage += (auradamagemode[attacker] == 0) ? auradamage[attacker] : RoundToNearest(damage * 0.01 * auradamage[attacker]);
		return Plugin_Changed;
	}
	return Plugin_Continue;
}

не работает:
PHP:
public Action:OnDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
	if (attacker > 0 && attacker < MaxClients && AuraAuth[attacker] && auradamage[attacker]) 
	{
		damage += (auradamagemode[attacker] == 0) ? auradamage[attacker] : RoundToNearest(damage * 0.01 * auradamage[attacker]);
		return Plugin_Changed;
	}
	if (victim > 0 && victim < MaxClients && AuraAuth[victim] && TimerReghp[victim] == INVALID_HANDLE && regHealthclient[client])
	{
		TimerReghp[victim] = CreateTimer(RegenTimer[victim] , RegenHP, victim);
	}
	return Plugin_Continue;
}

Что за бред!?!?
Во-первых, индекс виктима проверять не надо, он в любом случае будет валиден. Ну а так - что именно не работает?
 

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
Во-первых, индекс виктима проверять не надо, он в любом случае будет валиден. Ну а так - что именно не работает?

Думаю не работает таймер для регена хп при атаке игрока с увеличённым дамагом) Наверное, не все в курсе, что return - это не только возврат значения, но и в придачу выход из функции.

semjef, если плагин не приватный, то лучше выложи весь исходник в спойлер, думаю так будет гораздо меньше гемороя.
 
Последнее редактирование:

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
http://hlmod.ru/forum/plaginy-dlya-sourcemod/7197-aura-database-v-3-0-1-a.html

исходник более 700 строк))

дамаг мб будет приваткой, как и ещё пара функций))
также думаю сделать панельку для сайта))
цена будет меньше некуда, просто хочу игрушку в стиме:DDDD

До плагина дела нет, интерестно чё ты там намутил такого, что сервер падает :-D
 

semjef

semjef.ru
Сообщения
993
Реакции
444
то что добавлял всё есть в теме, больше ничего))
 

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
то что добавлял всё есть в теме, больше ничего))

Наверное, ты долго писал свою ауру)
Я её даже один раз редактировал под kv, некоторым пользователям не по силам редактировать бд)
 

S1deX

Скриптер ;)
Сообщения
129
Реакции
204

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
Хех, я в силу некоторых обстоятельств вернулся к бд :)

Даже не вики рекомендуется использовать бд, если размер кв превышает 10 кб вроде. :)
Я на кв лично стараюсь только конфиги делать. Удобней для редактирования, чем миллион кваров)
 
Сверху Снизу