Кровотечение

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
И что мне тогда делать?

C-подобный:
if (cHealth < 30) {SetEntityHealth(client, cHealth - MINUS_BLEED_HP);}   if (cHealth <= 0) ForcePlayerSuicide(client);
В любом случае, не дело совмещать такое. Выполнять либо одно, либо другое.
Больше смысла использовать обычное событие урона. Оффтоп
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
В любом случае, не дело совмещать такое. Выполнять либо одно, либо другое. Оффтоп

Мне бы придумать что-то с таймером который отнимает ХП.
Оффтоп
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
что-то с таймером который отнимает ХП.
PHP:
public Action:Bleed_Timer(Handle:timer, any:userid){
    new client = GetClientOfUserId(userid);
    
    if (client)
    {
        new cHealth = GetClientHealth(client) - MINUS_BLEED_HP;
        
        if (cHealth > 0){
            SetEntityHealth(client, cHealth);
        }
		else{
            PrintToChat(client, "Ты умер");
            EmitSoundToClient(client, "player/death1.wav", _, _, _, _, 1.0);
            ForcePlayerSuicide(client);
            Bleed[client] = false;
            return Plugin_Stop;
        }
    }
    
    return Plugin_Continue;
}
И никаких Datapack-таймеров! У тебя всего одно передаваемое int значение.
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #11
Сейчас R1KO за тебя напишет)
ванг

R1KO напишет, а ты просто добавишь.
ванг #2

PHP:
public OnPluginStart()
{
	HookEvent("player_death", PlayerDeath);
	HookEvent("player_hurt", PlayerHurt);
}

public PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast) 
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	Bleed[client] = false;
	ClientCommand(client,"r_screenoverlay 0");
	
	if(BleedTimerKill[client]) // это в ф-ю нужно вынести
	{
		KillTimer(BleedTimerKill[client]);
		BleedTimerKill[client] = INVALID_HANDLE;
	}
}

public OnClientPutInServer(client)
{
	Bleed[client] = false;
	
	if(BleedTimerKill[client])
	{
		KillTimer(BleedTimerKill[client]);
		BleedTimerKill[client] = INVALID_HANDLE;
	}
}

public OnClientDisconnect(client)
{
	Bleed[client] = false;
	
	if(BleedTimerKill[client])
	{
		KillTimer(BleedTimerKill[client]);
		BleedTimerKill[client] = INVALID_HANDLE;
	}
}

public PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast) 
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	if(IsPlayerAlive(client) && Bleed[client] == false && client != GetClientOfUserId(GetEventInt(event, "attacker")))
	{
		if(GetEventInt(event, "health") < 30 && GetConVarFloat(BleedChance) >= GetRandomInt(0, 100)) // BleedChance от 0 до 100 %
		{
			BleedTimerKill[client] = CreateTimer(BLEED_TIMER, Bleed_Timer, GetClientUserId(client), TIMER_REPEAT);
			PrintToChat(client, "У тебя кровотечение");
			ClientCommand(client, g_blood[GetRandomInt(0, 1)]);
			Bleed[victim] = true;
		}
	}
}

public Action:Bleed_Timer(Handle:timer, any:UserID)
{
	new client = GetClientOfUserId(UserID);
	if (client && IsPlayerAlive(client) && Bleed[client])
	{
		new cHealth = GetClientHealth(client) - MINUS_BLEED_HP;
		if (cHealth > 0)
		{
			SetEntityHealth(client, cHealth);
			return Plugin_Continue;
		}
		
		PrintToChat(client, "Ты умер");
		EmitSoundToClient(client, "player/death1.wav", _, _, _, _, 1.0);
		ForcePlayerSuicide(client);
		Bleed[client] = false;
		BleedTimerKill[client] = INVALID_HANDLE;
	} 

	return Plugin_Stop;
}
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
if (client && IsPlayerAlive(client) && Bleed[client])
{
    BleedTimerKill[client] = INVALID_HANDLE;
if(BleedTimerKill[client])
{
    KillTimer(BleedTimerKill[client]);
Да прибудет строк в логах ошибок)
что-то возьму, что-то оставлю
Оффтоп Правильно, если бы тебе указывали на ошибки, а ты их исправлял, обновляя код. А так особо не научишься.
 

R1KO

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

Оффтоп

Правильно, если бы тебе указывали на ошибки, а ты их исправлял, обновляя код. А так особо не научишься.
Тут изначальн подход не тот
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #15
AlmazON, вроде как везде всё сбрасывается
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
Как-то так.
PHP:
#pragma semicolon 1

#include <sdkhooks>
#include <sdktools>

/* Переменные */
#define BLEED_TIMER 3.0
#define MINUS_BLEED_HP 2
/* ========== */

new Handle:BleedChance;

new bool:Bleed[MAXPLAYERS+1];

new Handle:BleedTimerKill[MAXPLAYERS+1];

public Plugin:myinfo = {
	author = "Hejter",
	name = "[CS:GO] Bleeding",
	description = "Вызывает кровотечение с X шансом.",
	version = "0.1",
	url = "hlmod.ru & excw.ru",
}

public OnPluginStart(){
	BleedChance = CreateConVar("sm_bbb_chance", "0.33", "Шанс кровотечения, 1.00 = 100%, 0.50 = 50%, и т.д", FCVAR_PLUGIN);
	
	HookEvent("player_death", PlayerDeath);
	HookEvent("player_hurt", PlayerHurt);
	
	AutoExecConfig(true, "sm_bleeding");
}

public PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast) 
{
    new client = GetClientOfUserId(GetEventInt(event, "userid")); 
    Bleed[client] = false; 
    ClientCommand(client,"r_screenoverlay 0"); 
     
    if(BleedTimerKill[client])
    { 
        KillTimer(BleedTimerKill[client]); 
        BleedTimerKill[client] = INVALID_HANDLE; 
    } 
}

public OnClientPutInServer(client)
{
	Bleed[client] = false;
	
	if(BleedTimerKill[client]) 
	{ 
		KillTimer(BleedTimerKill[client]); 
		BleedTimerKill[client] = INVALID_HANDLE; 
	}
}

public OnClientDisconnect(client)
{
	if(BleedTimerKill[client]) 
	{ 
		KillTimer(BleedTimerKill[client]); 
		BleedTimerKill[client] = INVALID_HANDLE; 
	}
	
	Bleed[client] = false;
}

/*
public Action:Command_Bandage(client, args){
	if(IsClientInGame(client) && IsPlayerAlive(client)){
		{
			PrintToChat(client, "Ты перевязал себя!");
			ClientCommand(client,"r_screenoverlay 0");
			if(BleedTimerKill[client]) 
			{ 
				KillTimer(BleedTimerKill[client]); 
				BleedTimerKill[client] = INVALID_HANDLE; 
			}
		}
	}
	return Plugin_Handled;
} */
	
public PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast){
	new client = GetClientOfUserId(GetEventInt(event, "userid")); 
	
	new Float:iBleedChance = GetConVarFloat(BleedChance);
	new Float:iRoll = GetRandomFloat();
	if(IsPlayerAlive(client) && Bleed[client] == false && client != GetClientOfUserId(GetEventInt(event, "attacker")))
	{
		if (iBleedChance >= iRoll)
		{	
			if (GetEventInt(event, "health") < 30)
			{
				BleedTimerKill[client] = CreateTimer(BLEED_TIMER, Bleed_Timer, GetClientUserId(client), TIMER_REPEAT);
				//ClientCommand(client,g_blood[GetRandomInt(0, 1)]);
				Bleed[client] = true;
			}
		}
	}
}

public Action:Bleed_Timer(Handle:timer, any:UserID){ 
	new client = GetClientOfUserId(UserID); 
     
	if (client && IsPlayerAlive(client) && Bleed[client])  
	{ 
		new cHealth = GetClientHealth(client) - MINUS_BLEED_HP; 
         
		if (cHealth > 0){ 
			SetEntityHealth(client, cHealth);
			ClientCommand(client,"r_screenoverlay effects/blood2.vmt"); 			
			return Plugin_Continue; 
		}
		
		EmitSoundToClient(client, "player/death1.wav", _, _, _, _, 1.0);            
		ForcePlayerSuicide(client); 
		Bleed[client] = false; 
		if(BleedTimerKill[client]) 
		{ 
			KillTimer(BleedTimerKill[client]); 
			BleedTimerKill[client] = INVALID_HANDLE; 
		}		
	} 
	return Plugin_Stop; 
}
Осталось найти нормальный оверлей и пару мелочей дописать.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #17
Hejter, и оптимизировать.
И
Там бы одним таймером по всем игрокам нормально стоит проходиться.
тут согласен. при интервалах меньше 3 сек можно юзать 1 таймер. Игроки не заметят разницы.
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
Наоборот, даже реалистичней будет, когда в самом начале ранения кровотечение откроется сразу же или чуть позже, чем в прошлый раз.И ошибки из логов исправить.

Нету ошибок.
Мне бы функцию затемнение экрана. Функцию то нашел, но не понимаю как к ней прибавлять +1.
 

Похожие темы

Ответы
2
Просмотры
577
Ответы
0
Просмотры
351
Ответы
11
Просмотры
Ответы
10
Просмотры
Ответы
0
Просмотры
310
Сверху Снизу