Помогите с бонусом за 2 убийства за 20 сек

-LeXuS-

Участник
Сообщения
120
Реакции
60
Помогите сделать чтобы после первого убийства включался таймер на 20 сек, и если игрок за это время совершит 2 убийство, то ему давался бонус. Так же если он после этого, в течении 10 сек совершит 3 убийство давался еще больший бонус.
PHP:
public Action:PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
	new attacker =  GetClientOfUserId(GetEventInt(event, "attacker"));

	if(attacker > 0 && !IsFakeClient(attacker))
	{
		killcount[attacker] += 1;

		if(killcount[attacker] >= 2)
		{
			SetEntProp(attacker, Prop_Send, "m_iHealth", 120);
			SetEntProp(attacker, Prop_Send, "m_ArmorValue", 120);
		}
		if(killcount[attacker] >= 3)
		{
			SetEntProp(attacker, Prop_Send, "m_iHealth", 150);
			SetEntProp(attacker, Prop_Send, "m_ArmorValue", 150);
			killcount[attacker] == 0;
		}
	}
}
 

Серый™

CS:S Server
Сообщения
2,925
Реакции
1,376
-LeXuS-, вот тебе пример кода.
PHP:
#pragma semicolon 1

#include <sourcemod>

new g_iKills[MAXPLAYERS+1],
    Handle:g_hTimerKill[MAXPLAYERS+1] = INVALID_HANDLE;
    
public Plugin:myinfo =  
{
    name = "Kill Bonus",
    author = "",
    description = "Gives someone Hp, Armor on a kill",
    version = "0.1",
    url = "www.hlmod.ru"
}

public OnPluginStart()
{
    HookEvent("player_death", Event_PlayerDeath);
}

public Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
    new iClient =  GetClientOfUserId(GetEventInt(event, "attacker"));
  
    if(iClient > 0 && !IsFakeClient(iClient))
    {
        g_iKills[iClient]++;
    
        if(g_hTimerKill[iClient] == INVALID_HANDLE)
            g_hTimerKill[iClient] = CreateTimer(20.0, TimerKill, iClient);
    }
}

public Action:TimerKill(Handle:timer, any:iClient)
{
    if (IsClientInGame(iClient) && IsPlayerAlive(iClient))
    {    
        g_iKills[iClient] = iKill;
        
        new iCurrentHp    = GetClientHealth(iClient),
            iCurrentAr    = GetClientArmor(iClient);
        
        switch(iKill)
        {
            case 1:
            {
                SetEntProp(iClient, Prop_Send, "m_iHealth", iCurrentHp + 10);
                SetEntProp(iClient, Prop_Send, "m_ArmorValue", iCurrentAr + 10);
            }
            case 2:
            {
                SetEntProp(iClient, Prop_Send, "m_iHealth", iCurrentHp + 20);
                SetEntProp(iClient, Prop_Send, "m_ArmorValue", iCurrentAr + 20);
            }
            case 3:
            {
                SetEntProp(iClient, Prop_Send, "m_iHealth", iCurrentHp + 30);
                SetEntProp(iClient, Prop_Send, "m_ArmorValue", iCurrentAr + 30);
            }
            // и хоть сколько
            default:  // тут все остальные
            {
                SetEntProp(iClient, Prop_Send, "m_iHealth", iCurrentHp + 50);
                SetEntProp(iClient, Prop_Send, "m_ArmorValue", iCurrentAr + 50);
            }
        }
    }
    g_iKills[iClient] = 0;
    g_hTimerKill[iClient] == INVALID_HANDLE;
}
 
Последнее редактирование:

TolikCorp

Участник
Сообщения
874
Реакции
334
Лучше не таймером это делать, а получать время сервера. Пример можно глянуть в QUAKE sounds.
 

vanbka9

Участник
Сообщения
14
Реакции
13
-LeXuS-, Надеюсь понятный пример кода без таймера
PHP:
#pragma semicolon 1

#define PERVIY_KILL 	20.0
#define VTOROY_KILL 	10.0

#define BONUS_HEALT_KILL 	15
#define BONUS_ARMOR_KILL 	15

#define BONUS_HEALT_KILL2	30
#define BONUS_ARMOR_KILL2	30


new bool:raz[MAXPLAYERS+1] = false;
new bool:dva[MAXPLAYERS+1] = false;
new Float:raz_time[MAXPLAYERS+1];
new Float:dva_time[MAXPLAYERS+1];
new Float:null_dva_time[MAXPLAYERS+1];
new Float:null_tri_time[MAXPLAYERS+1];

public OnPluginStart()
{
	HookEvent("player_death",	player_death,	EventHookMode_Post);
}

public Action:player_death(Handle:event,const String:name[],bool:dontBroadcast)
{
	decl i, curr_healt, curr_armor;
	i = GetClientOfUserId(GetEventInt(event, "attacker"));
	curr_healt = GetClientHealth(i);
	curr_armor = GetClientArmor(i);
	if (!raz[i])
	{
		raz_time[i] = GetEngineTime();
		PrintToServer("[TEST] => raz_time[i] %f", raz_time[i]);
		raz[i] = true;
		return Plugin_Continue;
	}
	else
	{
		null_dva_time[i] = GetEngineTime()-raz_time[i];
		PrintToServer("[TEST] => null_dva_time[i] %f", null_dva_time[i]);
		if (null_dva_time[i] < PERVIY_KILL && !dva[i])
		{
			dva_time[i] = GetEngineTime();
			PrintToServer("[TEST] => dva_time[i] %f", dva_time[i]);
			SetEntProp(i, Prop_Send, "m_iHealth", curr_healt + BONUS_HEALT_KILL);
			SetEntProp(i, Prop_Send, "m_ArmorValue", curr_armor + BONUS_ARMOR_KILL);
			dva[i] = true;
			return Plugin_Continue;
		}
		else
			raz[i] = false;
	}
	if (dva[i])
	{
		null_tri_time[i] = GetEngineTime()-dva_time[i];
		PrintToServer("[TEST] => null_tri_time[i] %f", null_tri_time[i]);
		
		if (null_tri_time[i] < VTOROY_KILL)
		{
			PrintToServer("[TEST] => ACTION!!!");
			SetEntProp(i, Prop_Send, "m_iHealth", curr_healt + BONUS_HEALT_KILL2);
			SetEntProp(i, Prop_Send, "m_ArmorValue", curr_armor + BONUS_ARMOR_KILL2);
			raz[i] = false;
			dva[i] = false;
		}
		else
		{
			PrintToServer("[TEST] => NE USPEL");
			raz[i] = false;
			dva[i] = false;
		}
	}
	return Plugin_Continue;
}
 

Вложения

  • primer.sp
    2 КБ · Просмотры: 1

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Simple Kill Bonus - бонус за 2-3 убийства на время

Такая куча переменных и действий с ними...
Вот мой более оптимальный и простой пример:
PHP:
#define VTOROJ_KILL     20.0 
#define TRETIJ_KILL     30.0 

#define BONUS_HEALT_KILL     15 
#define BONUS_ARMOR_KILL     15 

#define BONUS_HEALT_KILL2    30 
#define BONUS_ARMOR_KILL2    30 

new bool:DoubleKill[MAXPLAYERS+1], Float:fTime[MAXPLAYERS+1]; 

public OnPluginStart() 
{
	HookEvent("player_death",		player_death);
	HookEvent("player_activate",	player_activate);
}

public player_activate(Handle:event,String:name[],bool:dontBroadcast)
{
	new i = GetClientOfUserId(GetEventInt(event, "userid"));
	fTime[i] = 0.0;
	DoubleKill[i] = false;
}

public player_death(Handle:event,String:name[],bool:dontBroadcast)
{
	new i = GetEventInt(event, "attacker");
	if (GetEventInt(event, "userid") != i && (i = GetClientOfUserId(i)))
	{
		if (DoubleKill[i])
		{
			DoubleKill[i] = false;
			if ((GetEngineTime() - fTime[i]) <= TRETIJ_KILL)
			{
				SetEntProp(i, Prop_Send, "m_iHealth", GetClientHealth(i) + BONUS_HEALT_KILL2);
				SetEntProp(i, Prop_Send, "m_ArmorValue", GetClientArmor(i) + BONUS_ARMOR_KILL2);
				PrintToChat(i, "Третье убийство! Вы получили бонус в размере %i HP и %i брони!", BONUS_HEALT_KILL2, BONUS_ARMOR_KILL2);
			}
			fTime[i] = 0.0;
		}
		else if (fTime[i])
		{
			if ((GetEngineTime() - fTime[i]) <= VTOROJ_KILL)
			{
				SetEntProp(i, Prop_Send, "m_iHealth", GetClientHealth(i) + BONUS_HEALT_KILL);
				SetEntProp(i, Prop_Send, "m_ArmorValue", GetClientArmor(i) + BONUS_ARMOR_KILL);
				DoubleKill[i] = true;
				PrintToChat(i, "Второе убийство! Вы получили бонус в размере %i HP и %i брони!", BONUS_HEALT_KILL, BONUS_ARMOR_KILL);
			}
			else fTime[i] = 0.0;
		}
		else
		{
			fTime[i] = GetEngineTime();
			PrintToChat(i, "Соверши другие убийства быстро и получи бонус!");
		}
	}
}
За самое первое убийство ничего не даётся.
Если второе совершено за VTOROJ_KILL секунд времени, то ему выдаст бонус в размере BONUS_HEALT_KILL HP к его здоровью и BONUS_ARMOR_KILL к его броне.
Если третье совершено за TRETIJ_KILL секунд времени, то ему выдаст бонус в размере BONUS_HEALT_KILL2 HP к его здоровью и BONUS_ARMOR_KILL2 к его броне.
Если игрок не успевает - сброс и нужно снова совершить 2-3 убийства подряд.
player_activate осуществляет новый счёт бонусов, когда игрок переподключился (или это другой игрок), а также в случае смены карты на сервере.
Предусмотрены самоубийства, в отличии от примеров выше, но нет моментального сброса, когда самого "лидера" убивают.
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
Re: Simple Kill Bonus - бонус за 2-3 убийства на время

Такая куча переменных и действий с ними...
Вот мой более оптимальный и простой пример:
PHP:
#define VTOROJ_KILL     20.0 
#define TRETIJ_KILL     30.0 

#define BONUS_HEALT_KILL     15 
#define BONUS_ARMOR_KILL     15 

#define BONUS_HEALT_KILL2    30 
#define BONUS_ARMOR_KILL2    30 

new bool:DoubleKill[MAXPLAYERS+1], Float:fTime[MAXPLAYERS+1]; 

public OnPluginStart() 
{
	HookEvent("player_death",		player_death);
	HookEvent("player_activate",	player_activate);
}

public player_activate(Handle:event,String:name[],bool:dontBroadcast)
{
	new i = GetClientOfUserId(GetEventInt(event, "userid"));
	fTime[i] = 0.0;
	DoubleKill[i] = false;
}

public player_death(Handle:event,String:name[],bool:dontBroadcast)
{
	new i = GetEventInt(event, "attacker");
	if (GetEventInt(event, "userid") != i && (i = GetClientOfUserId(i)))
	{
		if (DoubleKill[i])
		{
			DoubleKill[i] = false;
			if ((GetEngineTime() - fTime[i]) <= TRETIJ_KILL)
			{
				SetEntProp(i, Prop_Send, "m_iHealth", GetClientHealth(i) + BONUS_HEALT_KILL2);
				SetEntProp(i, Prop_Send, "m_ArmorValue", GetClientArmor(i) + BONUS_ARMOR_KILL2);
				PrintToChat(i, "Третье убийство! Вы получили бонус в размере %i HP и %i брони!", BONUS_HEALT_KILL2, BONUS_ARMOR_KILL2);
			}
			fTime[i] = 0.0;
		}
		else if (fTime[i])
		{
			if ((GetEngineTime() - fTime[i]) <= VTOROJ_KILL)
			{
				SetEntProp(i, Prop_Send, "m_iHealth", GetClientHealth(i) + BONUS_HEALT_KILL);
				SetEntProp(i, Prop_Send, "m_ArmorValue", GetClientArmor(i) + BONUS_ARMOR_KILL);
				DoubleKill[i] = true;
				PrintToChat(i, "Второе убийство! Вы получили бонус в размере %i HP и %i брони!", BONUS_HEALT_KILL, BONUS_ARMOR_KILL);
			}
			else fTime[i] = 0.0;
		}
		else
		{
			fTime[i] = GetEngineTime();
			PrintToChat(i, "Соверши другие убийства быстро и получи бонус!");
		}
	}
}
За самое первое убийство ничего не даётся.
Если второе совершено за VTOROJ_KILL секунд времени, то ему выдаст бонус в размере BONUS_HEALT_KILL HP к его здоровью и BONUS_ARMOR_KILL к его броне.
Если третье совершено за TRETIJ_KILL секунд времени, то ему выдаст бонус в размере BONUS_HEALT_KILL2 HP к его здоровью и BONUS_ARMOR_KILL2 к его броне.
Если игрок не успевает - сброс и нужно снова совершить 2-3 убийства подряд.
player_activate осуществляет новый счёт бонусов, когда игрок переподключился (или это другой игрок), а также в случае смены карты на сервере.
Предусмотрены самоубийства, в отличии от примеров выше, но нет моментального сброса, когда самого "лидера" убивают.

Самый адекватный пример кода, имхо.
 

-LeXuS-

Участник
Сообщения
120
Реакции
60
Re: Simple Kill Bonus - бонус за 2-3 убийства на время

AlmazON,
Такая куча переменных и действий с ними...
Вот мой более оптимальный и простой пример:
PHP:
#define VTOROJ_KILL     20.0 
#define TRETIJ_KILL     30.0 

#define BONUS_HEALT_KILL     15 
#define BONUS_ARMOR_KILL     15 

#define BONUS_HEALT_KILL2    30 
#define BONUS_ARMOR_KILL2    30 

new bool:DoubleKill[MAXPLAYERS+1], Float:fTime[MAXPLAYERS+1]; 

public OnPluginStart() 
{
	HookEvent("player_death",		player_death);
	HookEvent("player_activate",	player_activate);
}

public player_activate(Handle:event,String:name[],bool:dontBroadcast)
{
	new i = GetClientOfUserId(GetEventInt(event, "userid"));
	fTime[i] = 0.0;
	DoubleKill[i] = false;
}

public player_death(Handle:event,String:name[],bool:dontBroadcast)
{
	new i = GetEventInt(event, "attacker");
	if (GetEventInt(event, "userid") != i && (i = GetClientOfUserId(i)))
	{
		if (DoubleKill[i])
		{
			DoubleKill[i] = false;
			if ((GetEngineTime() - fTime[i]) <= TRETIJ_KILL)
			{
				SetEntProp(i, Prop_Send, "m_iHealth", GetClientHealth(i) + BONUS_HEALT_KILL2);
				SetEntProp(i, Prop_Send, "m_ArmorValue", GetClientArmor(i) + BONUS_ARMOR_KILL2);
				PrintToChat(i, "Третье убийство! Вы получили бонус в размере %i HP и %i брони!", BONUS_HEALT_KILL2, BONUS_ARMOR_KILL2);
			}
			fTime[i] = 0.0;
		}
		else if (fTime[i])
		{
			if ((GetEngineTime() - fTime[i]) <= VTOROJ_KILL)
			{
				SetEntProp(i, Prop_Send, "m_iHealth", GetClientHealth(i) + BONUS_HEALT_KILL);
				SetEntProp(i, Prop_Send, "m_ArmorValue", GetClientArmor(i) + BONUS_ARMOR_KILL);
				DoubleKill[i] = true;
				PrintToChat(i, "Второе убийство! Вы получили бонус в размере %i HP и %i брони!", BONUS_HEALT_KILL, BONUS_ARMOR_KILL);
			}
			else fTime[i] = 0.0;
		}
		else
		{
			fTime[i] = GetEngineTime();
			PrintToChat(i, "Соверши другие убийства быстро и получи бонус!");
		}
	}
}
За самое первое убийство ничего не даётся.
Если второе совершено за VTOROJ_KILL секунд времени, то ему выдаст бонус в размере BONUS_HEALT_KILL HP к его здоровью и BONUS_ARMOR_KILL к его броне.
Если третье совершено за TRETIJ_KILL секунд времени, то ему выдаст бонус в размере BONUS_HEALT_KILL2 HP к его здоровью и BONUS_ARMOR_KILL2 к его броне.
Если игрок не успевает - сброс и нужно снова совершить 2-3 убийства подряд.
player_activate осуществляет новый счёт бонусов, когда игрок переподключился (или это другой игрок), а также в случае смены карты на сервере.
Предусмотрены самоубийства, в отличии от примеров выше, но нет моментального сброса, когда самого "лидера" убивают.

Иногда бывает, совершаешь убийство и выходит сообщение "Соверши другие убийства быстро и получи бонус!". Убиваешь второго, но если не успеваешь убить за VTOROJ_KILL секунд, то ничего не происходит (по сути же должно вылезти тоже самое сообщение?), убиваешь третьего и тут снова это сообщение
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
если не успеваешь убить за VTOROJ_KILL секунд, то ничего не происходит (по сути же должно вылезти тоже самое сообщение?)
Неа. Внимательней:
Если игрок не успевает - сброс и нужно снова совершить 2-3 убийства подряд.
Сбрасывает твою попытку на 0. Оффтоп Если хочешь исправить, чтобы это считалось 1 убийством, то приравняй: fTime = GetEngineTime(); для функции во втором убийстве, вместо 0.0.
убиваешь третьего
Ты имеешь ввиду после третьего? Потому что это конец бонусов)
Как сам хотел то? Я просто дал "разнообразный" пример.
 
Последнее редактирование:
Сверху Снизу