[CS: GO] Кровотечение

maize

Участник
Сообщения
100
Реакции
7
Не понял что ты там делаешь, но в первом посте без саунда.
а "эффект мерцания" и так работает.

Так, в компиле плагина сделал 70 хп, 1 хп за x секунд, ничего не менял.

интервал, пробую каждый раз новые варианты, всеравно то быстро, то приумнажается в конце... то прирастает. 1.5 , 2.5 , 3(пробую разные варианты). Нету как раньше, чтобы потратилось 70сек нужно 70 тиков... раньше ставил 1.5 интервал, сейчас 70 тиков за 25-30сек проходит.

надо было оставить 0.7 версию блин.
 

Hejter

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

Ты сюда пофлудить пришел?
На любой какой хочешь. Парашют и двойной прыжок даже на паблик ставят.

Добавлено через 58 секунд
Так, в компиле плагина сделал 70 хп, 1 хп за x секунд, ничего не менял.

интервал, пробую каждый раз новые варианты, всеравно то быстро, то приумнажается в конце... то прирастает. 1.5 , 2.5 , 3(пробую разные варианты). Нету как раньше, чтобы потратилось 70сек нужно 70 тиков... раньше ставил 1.5 интервал, сейчас 70 тиков за 25-30сек проходит.

надо было оставить 0.7 версию блин.

Есть 0.7 версия? Посмотрю что не так.
 
Последнее редактирование:

maize

Участник
Сообщения
100
Реакции
7
Ты сюда пофлудить пришел?
На любой какой хочешь. Парашют и двойной прыжок даже на паблик ставят.

Добавлено через 58 секунд


Есть 0.7 версия? Посмотрю что не так.

все , что осталось, большинство я редактировал для 70 хп.

хочу просто, чтобы было 1 тик - 1 хп - за 1 секунду, можно 1.5, как я делал в прошлой версии, интервал 1.5 секунды, начиналось все от 70 здоровья. 10 сила тряски, и интервал тряски 1.5 делал. И все, напрягала только музыка.

сейчас, такое чувство что 1 хп за Х сек удален, канает только интервал, тобишь интервал это количество отнимаемого здоровья
 

Вложения

  • bleeding (1).smx
    8.6 КБ · Просмотры: 7
  • bleeding (2).smx
    8.3 КБ · Просмотры: 9
  • bleeding.sp
    6.7 КБ · Просмотры: 6
  • bleeding.smx
    8.7 КБ · Просмотры: 9

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
Hejter, красава
PHP:
CheckPlayer(client)
{
	new cHealth = GetClientHealth(client) - MINUS_BLEED_HP;
	new Float:iBleedChance = GetConVarFloat(BleedChance);
	new Float:iRoll = GetRandomFloat();
	if (IsClientInGame(client) && IsPlayerAlive(client) && Bleed[client])
	{
Сначала получил хп игрока,а потом проверил есть ли он вообще..

И зачем тут проверка IsClientInGame если она есть в макросе LoopIngameClients ?

PHP:
public PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast){
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	
	if(IsClientInGame(client) && IsPlayerAlive(client))
	{
		Bleed[client] = false;
		ClientCommand(client,"r_screenoverlay 0");
	}
}

public PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast) 
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));  
     
	if(IsClientInGame(client)) 
	{ 
		Bleed[client] = false;
		ClientCommand(client,"r_screenoverlay 0");
	} 
}
Повторяется код. Сделай оба события на один каллбек.
PHP:
public InsertInfo(client){
	Bleed[client] = false;
}
это не public функция.

PHP:
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")))
	{
Опять сначала сделал рандом, а только потом проверил нужен ли он вообще.

и SetBlind SetShake тоже не паблик функции

Посмотри. Что не так.
PHP:
#pragma semicolon 1

#include <sdkhooks>
#include <sdktools>

/* Спасибо Zipcore - макросы */
#define LoopIngameClients(%1) for(int %1=1;%1<=MaxClients;++%1)\
if(IsClientInGame(%1))

/* Переменные */
#define MINUS_BLEED_HP 1 // Здоровье, отнимаемое у игрока в X секунд.
#define BLEED_BORDER 30 // Здоровье, ниже которого начинается кровотечение.
/* ========== */

new Handle:BleedChance;
new bool:Bleed[MAXPLAYERS + 1];

Handle g_hTimer = null;
ConVar g_cvCheckInterval;
new Float:g_fCheckInterval;

new Float:g_fShakeAmp;
new Float:g_fShakeTime;

new Handle:g_hConVar_fShakeAmp = INVALID_HANDLE;
new Handle:g_hConVar_fShakeTime = INVALID_HANDLE;

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

public OnPluginStart(){
	BleedChance = CreateConVar("sm_bleeding_chance", "0.25", "Шанс кровотечения, 1.00 = 100%, 0.50 = 50%, и т.д", FCVAR_PLUGIN);
	g_hConVar_fShakeAmp = CreateConVar("sm_heartbeat_shakeamp", "7.0", "Сила тряски экрана");
	g_hConVar_fShakeTime = CreateConVar("sm_heartbeat_shaketime", "3.0", "промежуток тряски экрана");
	g_cvCheckInterval = CreateConVar("sm_check_interval", "2.5", "Отрезок времени через которое игроку будет снимать ХП.");
	
	HookConVarChange(g_hConVar_fShakeAmp, ConVar_Callback);
	HookConVarChange(g_hConVar_fShakeTime, ConVar_Callback);
	HookConVarChange(g_cvCheckInterval, ConVar_Callback);
	
	g_fShakeAmp = GetConVarFloat(g_hConVar_fShakeAmp);
	g_fShakeTime = GetConVarFloat(g_hConVar_fShakeTime);
	g_fCheckInterval = GetConVarFloat(g_cvCheckInterval);
	
	HookEvent("player_death", PlayerDeath);
	HookEvent("player_hurt", PlayerHurt);
	HookEvent("player_spawn", PlayerSpawn);
	
	HookEvent("round_start", RoundStart);
	HookEvent("round_end", RoundEnd);
	
	AutoExecConfig(true, "sm_bleeding");
}

public OnMapStart()
{
	AddFileToDownloadsTable("materials/excw/bleed.vmt");
	AddFileToDownloadsTable("materials/excw/bleed.vtf");
}

public ConVar_Callback(Handle:cvar, const String:oldVal[], const String:newVal[])
{
	if ( cvar == g_hConVar_fShakeAmp )
	{
		g_fShakeAmp = GetConVarFloat(g_hConVar_fShakeAmp);
	}
	else if ( cvar == g_hConVar_fShakeTime )
	{
		g_fShakeTime = GetConVarFloat(g_hConVar_fShakeTime);
	}
	else if (cvar == g_cvCheckInterval)
	{
		g_fCheckInterval = GetConVarFloat(g_cvCheckInterval);
		
		if(g_hTimer != null)
			CloseHandle(g_hTimer);
		
		g_hTimer = CreateTimer(g_fCheckInterval, Timer_CheckPlayers, 0, TIMER_REPEAT);
	}
}

public RoundStart(Handle:event, const String:name[], bool:dontBroadcast){
	g_hTimer = CreateTimer(g_fCheckInterval, Timer_CheckPlayers, 0, TIMER_REPEAT);
}

public RoundEnd(Handle:event, const String:name[], bool:dontBroadcast){
	if(g_hTimer != null)
	{
		KillTimer(g_hTimer);
		g_hTimer = null;
	}
}

public Action:Timer_CheckPlayers(Handle:timer)
{
	CheckPlayers();
	
	return Plugin_Continue;
}

CheckPlayers()
{
	LoopIngameClients(client)
	{		
		CheckPlayer(client);
	}
}

CheckPlayer(client)
{
	new Float:iBleedChance = GetConVarFloat(BleedChance);
	new Float:iRoll = GetRandomFloat();
	if (IsPlayerAlive(client) && Bleed[client])
	{
		new cHealth = GetClientHealth(client) - MINUS_BLEED_HP;
		if (iBleedChance >= iRoll)
		{
			if (cHealth <= BLEED_BORDER) 
			{
				Bleed[client] = true;
				SetEntityHealth(client, cHealth);
				ClientCommand(client,"r_screenoverlay excw/bleed");
				SetBlind(client, 300, 0, {255, 0, 0, 30});
				SetShake(client);
			}
		}
	
		if (cHealth <= 0)
		{			
			ForcePlayerSuicide(client); 	
			Bleed[client] = false;
		}	
	}
}	


public PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast){
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	
	if(IsClientInGame(client) && IsPlayerAlive(client))
	{
		InsertInfo(client);
		ClientCommand(client,"r_screenoverlay 0");
	}
}

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

public OnClientPutInServer(client)
{
	InsertInfo(client);
}

public OnClientDisconnect(client){
	InsertInfo(client);
}

/* Спасибо AlmazON - убиваем глобальный таймер, если все игроки вышли с сервера */
public OnClientDisconnect_Post(client)
{
	for (new i = 1; i <= MaxClients; ++i)
	{
		if (IsClientInGame(i)) return;
	}
	if(g_hTimer != null)
	{
		KillTimer(g_hTimer);
		g_hTimer = null;
	}
}

InsertInfo(client){
	Bleed[client] = false;
}


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") <= BLEED_BORDER)
			{
				Bleed[client] = true;
			}
		}
	}
}

/* Функция затемнение экрана */
stock SetBlind(client, duration, hold_time, const color[4]) {
    new flags = 0x0001;
    new Handle:message = StartMessageOne("Fade", client);  
    if (message != INVALID_HANDLE)  
    {   
        PbSetInt(message, "duration", duration); // 1 * 300 = 300 - сколько duration поставишь, столько он времени будет светлеть
        PbSetInt(message, "hold_time", hold_time); // Время задержки цвета
        PbSetInt(message, "flags", flags);
        PbSetColor(message, "clr", color); 
        EndMessage();  
    } 
}

/* Функция тряски экрана */
stock SetShake(client){
	new Handle:hBf = StartMessageOne("Shake", client);
	if( hBf != INVALID_HANDLE )
	{
		PbSetInt(hBf, "command", 0);
		PbSetFloat(hBf, "local_amplitude", g_fShakeAmp);
		PbSetFloat(hBf, "frequency", 1.0);
		PbSetFloat(hBf, "duration", g_fShakeTime);
		EndMessage();
	}
}

Добавлено через 1 минуту
все , что осталось, большинство я редактировал для 70 хп.

хочу просто, чтобы было 1 тик - 1 хп - за 1 секунду, можно 1.5, как я делал в прошлой версии, интервал 1.5 секунды, начиналось все от 70 здоровья. 10 сила тряски, и интервал тряски 1.5 делал. И все, напрягала только музыка.

сейчас, такое чувство что 1 хп за Х сек удален, канает только интервал, тобишь интервал это количество отнимаемого здоровья

Эта та версия которая тебе нужна? Конкретно рабочая под твои нужды?
Возможно ты не понял суть переменных.
#define MINUS_BLEED_HP 1 // Кол-во ед. отнимаемого у игрока (HP)
sm_check_interval "2.5" Время через которое у игрока отнимает HP.
Тобишь каждые 2.5 сек будет отнимать по 1 ед. HP.
 
Последнее редактирование:

maize

Участник
Сообщения
100
Реакции
7
Посмотри. Что не так.
PHP:
#pragma semicolon 1

#include <sdkhooks>
#include <sdktools>

/* Спасибо Zipcore - макросы */
#define LoopIngameClients(%1) for(int %1=1;%1<=MaxClients;++%1)\
if(IsClientInGame(%1))

/* Переменные */
#define MINUS_BLEED_HP 1 // Здоровье, отнимаемое у игрока в X секунд.
#define BLEED_BORDER 30 // Здоровье, ниже которого начинается кровотечение.
/* ========== */

new Handle:BleedChance;
new bool:Bleed[MAXPLAYERS + 1];

Handle g_hTimer = null;
ConVar g_cvCheckInterval;
new Float:g_fCheckInterval;

new Float:g_fShakeAmp;
new Float:g_fShakeTime;

new Handle:g_hConVar_fShakeAmp = INVALID_HANDLE;
new Handle:g_hConVar_fShakeTime = INVALID_HANDLE;

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

public OnPluginStart(){
	BleedChance = CreateConVar("sm_bleeding_chance", "0.25", "Шанс кровотечения, 1.00 = 100%, 0.50 = 50%, и т.д", FCVAR_PLUGIN);
	g_hConVar_fShakeAmp = CreateConVar("sm_heartbeat_shakeamp", "7.0", "Сила тряски экрана");
	g_hConVar_fShakeTime = CreateConVar("sm_heartbeat_shaketime", "3.0", "промежуток тряски экрана");
	g_cvCheckInterval = CreateConVar("sm_check_interval", "2.5", "Отрезок времени через которое игроку будет снимать ХП.");
	
	HookConVarChange(g_hConVar_fShakeAmp, ConVar_Callback);
	HookConVarChange(g_hConVar_fShakeTime, ConVar_Callback);
	HookConVarChange(g_cvCheckInterval, ConVar_Callback);
	
	g_fShakeAmp = GetConVarFloat(g_hConVar_fShakeAmp);
	g_fShakeTime = GetConVarFloat(g_hConVar_fShakeTime);
	g_fCheckInterval = GetConVarFloat(g_cvCheckInterval);
	
	HookEvent("player_death", PlayerDeath);
	HookEvent("player_hurt", PlayerHurt);
	HookEvent("player_spawn", PlayerSpawn);
	
	HookEvent("round_start", RoundStart);
	HookEvent("round_end", RoundEnd);
	
	AutoExecConfig(true, "sm_bleeding");
}

public OnMapStart()
{
	AddFileToDownloadsTable("materials/excw/bleed.vmt");
	AddFileToDownloadsTable("materials/excw/bleed.vtf");
}

public ConVar_Callback(Handle:cvar, const String:oldVal[], const String:newVal[])
{
	if ( cvar == g_hConVar_fShakeAmp )
	{
		g_fShakeAmp = GetConVarFloat(g_hConVar_fShakeAmp);
	}
	else if ( cvar == g_hConVar_fShakeTime )
	{
		g_fShakeTime = GetConVarFloat(g_hConVar_fShakeTime);
	}
	else if (cvar == g_cvCheckInterval)
	{
		g_fCheckInterval = GetConVarFloat(g_cvCheckInterval);
		
		if(g_hTimer != null)
			CloseHandle(g_hTimer);
		
		g_hTimer = CreateTimer(g_fCheckInterval, Timer_CheckPlayers, 0, TIMER_REPEAT);
	}
}

public RoundStart(Handle:event, const String:name[], bool:dontBroadcast){
	g_hTimer = CreateTimer(g_fCheckInterval, Timer_CheckPlayers, 0, TIMER_REPEAT);
}

public RoundEnd(Handle:event, const String:name[], bool:dontBroadcast){
	if(g_hTimer != null)
	{
		KillTimer(g_hTimer);
		g_hTimer = null;
	}
}

public Action:Timer_CheckPlayers(Handle:timer)
{
	CheckPlayers();
	
	return Plugin_Continue;
}

CheckPlayers()
{
	LoopIngameClients(client)
	{		
		CheckPlayer(client);
	}
}

CheckPlayer(client)
{
	new Float:iBleedChance = GetConVarFloat(BleedChance);
	new Float:iRoll = GetRandomFloat();
	if (IsPlayerAlive(client) && Bleed[client])
	{
		new cHealth = GetClientHealth(client) - MINUS_BLEED_HP;
		if (iBleedChance >= iRoll)
		{
			if (cHealth <= BLEED_BORDER) 
			{
				Bleed[client] = true;
				SetEntityHealth(client, cHealth);
				ClientCommand(client,"r_screenoverlay excw/bleed");
				SetBlind(client, 300, 0, {255, 0, 0, 30});
				SetShake(client);
			}
		}
	
		if (cHealth <= 0)
		{			
			ForcePlayerSuicide(client); 	
			Bleed[client] = false;
		}	
	}
}	


public PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast){
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	
	if(IsClientInGame(client) && IsPlayerAlive(client))
	{
		InsertInfo(client);
		ClientCommand(client,"r_screenoverlay 0");
	}
}

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

public OnClientPutInServer(client)
{
	InsertInfo(client);
}

public OnClientDisconnect(client){
	InsertInfo(client);
}

/* Спасибо AlmazON - убиваем глобальный таймер, если все игроки вышли с сервера */
public OnClientDisconnect_Post(client)
{
	for (new i = 1; i <= MaxClients; ++i)
	{
		if (IsClientInGame(i)) return;
	}
	if(g_hTimer != null)
	{
		KillTimer(g_hTimer);
		g_hTimer = null;
	}
}

InsertInfo(client){
	Bleed[client] = false;
}


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") <= BLEED_BORDER)
			{
				Bleed[client] = true;
			}
		}
	}
}

/* Функция затемнение экрана */
stock SetBlind(client, duration, hold_time, const color[4]) {
    new flags = 0x0001;
    new Handle:message = StartMessageOne("Fade", client);  
    if (message != INVALID_HANDLE)  
    {   
        PbSetInt(message, "duration", duration); // 1 * 300 = 300 - сколько duration поставишь, столько он времени будет светлеть
        PbSetInt(message, "hold_time", hold_time); // Время задержки цвета
        PbSetInt(message, "flags", flags);
        PbSetColor(message, "clr", color); 
        EndMessage();  
    } 
}

/* Функция тряски экрана */
stock SetShake(client){
	new Handle:hBf = StartMessageOne("Shake", client);
	if( hBf != INVALID_HANDLE )
	{
		PbSetInt(hBf, "command", 0);
		PbSetFloat(hBf, "local_amplitude", g_fShakeAmp);
		PbSetFloat(hBf, "frequency", 1.0);
		PbSetFloat(hBf, "duration", g_fShakeTime);
		EndMessage();
	}
}

Добавлено через 1 минуту


Эта та версия которая тебе нужна? Конкретно рабочая под твои нужды?
Возможно ты не понял суть переменных.
#define MINUS_BLEED_HP 1 // Кол-во ед. отнимаемого у игрока (HP)
sm_check_interval "2.5" Время через которое у игрока отнимает HP.
Тобишь каждые 2.5 сек будет отнимать по 1 ед. HP.

Вот, сделал, скомпилил, все как было раньше, попросил парнягу стрельнуть мне в ноги, у меня каждую секунду отнимается 1.5
 

Вложения

  • bleeding.smx
    8.3 КБ · Просмотры: 11

pracc

Быть, а не казаться.
Сообщения
947
Реакции
542
Ты сюда пофлудить пришел?
На любой какой хочешь. Парашют и двойной прыжок даже на паблик ставят.

Да нет почему сразу пофлудить.
Я разве не могу высказать своё мнение касаемо данного плагина?
 

maize

Участник
Сообщения
100
Реакции
7
Ты какую-то ахинею несешь.

Чушь? ЗАЕ меня уже , интервал 1.5, шанс 100%, после 70хп, 1хп снимается. вот такие кфг настройки.

мне всодили с мухи на 50 урона. ХЕРАЧИТ ПО 3 хп каждую секунду. я ахинею несу?

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

Вложения

  • sm_bleeding.cfg
    577 байт · Просмотры: 7
  • bleeding.smx
    8.3 КБ · Просмотры: 7

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,756
Hejter,
PHP:
#pragma semicolon 1

#include <sdkhooks>
#include <sdktools>

/* Переменные */
#define MINUS_BLEED_HP 1 // Здоровье, отнимаемое у игрока в X секунд.
#define BLEED_BORDER 30 // Здоровье, ниже которого начинается кровотечение.
/* ========== */

new Handle:g_hBleedChance;
new Float:g_fBleedChance;
new bool:Bleed[MAXPLAYERS + 1];

Handle g_hTimer = null;
ConVar g_cvCheckInterval;
new Float:g_fCheckInterval;

new Float:g_fShakeAmp;
new Float:g_fShakeTime;

new Handle:g_hConVar_fShakeAmp = INVALID_HANDLE;
new Handle:g_hConVar_fShakeTime = INVALID_HANDLE;

/* Спасибо Zipcore - макросы */
#define LoopIngameClients(%1) for(int %1=1;%1<=MaxClients;++%1)\
if(Bleed[%1])

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

public OnPluginStart(){
	g_hBleedChance = CreateConVar("sm_bleeding_chance", "0.25", "Шанс кровотечения, 1.00 = 100%, 0.50 = 50%, и т.д", FCVAR_PLUGIN);
	g_hConVar_fShakeAmp = CreateConVar("sm_heartbeat_shakeamp", "7.0", "Сила тряски экрана");
	g_hConVar_fShakeTime = CreateConVar("sm_heartbeat_shaketime", "3.0", "промежуток тряски экрана");
	g_cvCheckInterval = CreateConVar("sm_check_interval", "2.5", "Отрезок времени через которое игроку будет снимать ХП.");

	HookConVarChange(g_hBleedChance, ConVar_Callback);
	HookConVarChange(g_hConVar_fShakeAmp, ConVar_Callback);
	HookConVarChange(g_hConVar_fShakeTime, ConVar_Callback);
	HookConVarChange(g_cvCheckInterval, ConVar_Callback);

	g_fBleedChance = GetConVarFloat(g_hBleedChance);
	g_fShakeAmp = GetConVarFloat(g_hConVar_fShakeAmp);
	g_fShakeTime = GetConVarFloat(g_hConVar_fShakeTime);
	g_fCheckInterval = GetConVarFloat(g_cvCheckInterval);
	
	HookEvent("player_death", StopBlood);
	HookEvent("player_hurt", PlayerHurt);
	HookEvent("player_spawn", StopBlood);
	
	HookEvent("round_start", RoundStart);
	HookEvent("round_end", RoundEnd);
	
	AutoExecConfig(true, "sm_bleeding");
}

public OnMapStart()
{
	AddFileToDownloadsTable("materials/excw/bleed.vmt");
	AddFileToDownloadsTable("materials/excw/bleed.vtf");
}

public ConVar_Callback(Handle:cvar, const String:oldVal[], const String:newVal[])
{
	if ( cvar == g_hConVar_fShakeAmp )
	{
		g_fShakeAmp = GetConVarFloat(g_hConVar_fShakeAmp);
	}
	else if ( cvar == g_hConVar_fShakeTime )
	{
		g_fShakeTime = GetConVarFloat(g_hConVar_fShakeTime);
	}
	else if (cvar == g_cvCheckInterval)
	{
		g_fCheckInterval = GetConVarFloat(g_cvCheckInterval);
		
		if(g_hTimer != null)
			CloseHandle(g_hTimer);
		
		g_hTimer = CreateTimer(g_fCheckInterval, Timer_CheckPlayers, 0, TIMER_REPEAT);
	}
	else g_fBleedChance = GetConVarFloat(g_hBleedChance);
}

public RoundStart(Handle:event, const String:name[], bool:dontBroadcast){
	g_hTimer = CreateTimer(g_fCheckInterval, Timer_CheckPlayers, 0, TIMER_REPEAT);
}

public RoundEnd(Handle:event, const String:name[], bool:dontBroadcast){
	if(g_hTimer != null)
	{
		KillTimer(g_hTimer);
		g_hTimer = null;
	}
}

public Action:Timer_CheckPlayers(Handle:timer)
{
	decl cHealth;
	LoopIngameClients(client)
	{
		if (g_fBleedChance >= GetRandomFloat())
		{
			cHealth = GetClientHealth(client) - MINUS_BLEED_HP;
			if (cHealth <= 0) ForcePlayerSuicide(client);
			else if (cHealth <= BLEED_BORDER)
			{
				Bleed[client] = true;
				SetEntityHealth(client, cHealth);
				ClientCommand(client,"r_screenoverlay excw/bleed");
				SetBlind(client, 300, 0, {255, 0, 0, 30});
				SetShake(client);
			}
		}	
	}
	return Plugin_Continue;
}


public StopBlood(Handle:event, const String:name[], bool:dontBroadcast){
	decl client;
	Bleed[client = GetClientOfUserId(GetEventInt(event, "userid"))] = false;
	ClientCommand(client,"r_screenoverlay 0");
}

/* Спасибо AlmazON - убиваем глобальный таймер, если все игроки вышли с сервера */
public OnClientDisconnect_Post(client)
{
	Bleed[client] = false;
	for (new i = 1; i <= MaxClients; ++i)
	{
		if (IsClientInGame(i)) return;
	}
	if(g_hTimer != null)
	{
		KillTimer(g_hTimer);
		g_hTimer = null;
	}
}

public PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast){
	new client = GetClientOfUserId(GetEventInt(event, "userid")); 
	if(Bleed[client] == false && client != GetClientOfUserId(GetEventInt(event, "attacker")))
	{
		if (GetEventInt(event, "health") <= BLEED_BORDER)
		{
			if (g_fBleedChance >= GetRandomFloat())
			{
				Bleed[client] = true;
			}
		}
	}
}

/* Функция затемнение экрана */
public SetBlind(client, duration, hold_time, const color[4]) {
    new flags = 0x0001;
    new Handle:message = StartMessageOne("Fade", client);  
    if (message != INVALID_HANDLE)  
    {   
        PbSetInt(message, "duration", duration); // 1 * 300 = 300 - сколько duration поставишь, столько он времени будет светлеть
        PbSetInt(message, "hold_time", hold_time); // Время задержки цвета
        PbSetInt(message, "flags", flags);
        PbSetColor(message, "clr", color); 
        EndMessage();  
    } 
}

/* Функция тряски экрана */
public SetShake(client){
	new Handle:hBf = StartMessageOne("Shake", client);
	if( hBf != INVALID_HANDLE )
	{
		PbSetInt(hBf, "command", 0);
		PbSetFloat(hBf, "local_amplitude", g_fShakeAmp);
		PbSetFloat(hBf, "frequency", 1.0);
		PbSetFloat(hBf, "duration", g_fShakeTime);
		EndMessage();
	}
}
По поводу "убиваем глобальный таймер, если все игроки вышли с сервера" - сомневаюсь, что оно вообще нужно. В этот момент может вызываться конец раунда и таймер убьётся сам. Проверь в CS:GO.
 
Последнее редактирование:

Hejter

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

#include <sdkhooks>
#include <sdktools>

/* Переменные */
#define MINUS_BLEED_HP 1 // Здоровье, отнимаемое у игрока в X секунд.
#define BLEED_BORDER 30 // Здоровье, ниже которого начинается кровотечение.
/* ========== */

new Handle:g_hBleedChance;
new Float:g_fBleedChance;
new bool:Bleed[MAXPLAYERS + 1];

Handle g_hTimer = null;
ConVar g_cvCheckInterval;
new Float:g_fCheckInterval;

new Float:g_fShakeAmp;
new Float:g_fShakeTime;

new Handle:g_hConVar_fShakeAmp = INVALID_HANDLE;
new Handle:g_hConVar_fShakeTime = INVALID_HANDLE;

/* Спасибо Zipcore - макросы */
#define LoopIngameClients(%1) for(int %1=1;%1<=MaxClients;++%1)\
if(Bleed(%1))

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

public OnPluginStart(){
	g_hBleedChance = CreateConVar("sm_bleeding_chance", "0.25", "Шанс кровотечения, 1.00 = 100%, 0.50 = 50%, и т.д", FCVAR_PLUGIN);
	g_hConVar_fShakeAmp = CreateConVar("sm_heartbeat_shakeamp", "7.0", "Сила тряски экрана");
	g_hConVar_fShakeTime = CreateConVar("sm_heartbeat_shaketime", "3.0", "промежуток тряски экрана");
	g_cvCheckInterval = CreateConVar("sm_check_interval", "2.5", "Отрезок времени через которое игроку будет снимать ХП.");

	HookConVarChange(g_hBleedChance, ConVar_Callback);
	HookConVarChange(g_hConVar_fShakeAmp, ConVar_Callback);
	HookConVarChange(g_hConVar_fShakeTime, ConVar_Callback);
	HookConVarChange(g_cvCheckInterval, ConVar_Callback);

	g_fBleedChance = GetConVarFloat(g_hBleedChance);
	g_fShakeAmp = GetConVarFloat(g_hConVar_fShakeAmp);
	g_fShakeTime = GetConVarFloat(g_hConVar_fShakeTime);
	g_fCheckInterval = GetConVarFloat(g_cvCheckInterval);
	
	HookEvent("player_death", StopBlood);
	HookEvent("player_hurt", PlayerHurt);
	HookEvent("player_spawn", StopBlood);
	
	HookEvent("round_start", RoundStart);
	HookEvent("round_end", RoundEnd);
	
	AutoExecConfig(true, "sm_bleeding");
}

public OnMapStart()
{
	AddFileToDownloadsTable("materials/excw/bleed.vmt");
	AddFileToDownloadsTable("materials/excw/bleed.vtf");
}

public ConVar_Callback(Handle:cvar, const String:oldVal[], const String:newVal[])
{
	if ( cvar == g_hConVar_fShakeAmp )
	{
		g_fShakeAmp = GetConVarFloat(g_hConVar_fShakeAmp);
	}
	else if ( cvar == g_hConVar_fShakeTime )
	{
		g_fShakeTime = GetConVarFloat(g_hConVar_fShakeTime);
	}
	else if (cvar == g_cvCheckInterval)
	{
		g_fCheckInterval = GetConVarFloat(g_cvCheckInterval);
		
		if(g_hTimer != null)
			CloseHandle(g_hTimer);
		
		g_hTimer = CreateTimer(g_fCheckInterval, Timer_CheckPlayers, 0, TIMER_REPEAT);
	}
	else g_fBleedChance = GetConVarFloat(g_hBleedChance);
}

public RoundStart(Handle:event, const String:name[], bool:dontBroadcast){
	g_hTimer = CreateTimer(g_fCheckInterval, Timer_CheckPlayers, 0, TIMER_REPEAT);
}

public RoundEnd(Handle:event, const String:name[], bool:dontBroadcast){
	if(g_hTimer != null)
	{
		KillTimer(g_hTimer);
		g_hTimer = null;
	}
}

public Action:Timer_CheckPlayers(Handle:timer)
{
	decl cHealth;
	LoopIngameClients(client)
	{
		if (g_fBleedChance >= GetRandomFloat())
		{
			cHealth = GetClientHealth(client) - MINUS_BLEED_HP;
			if (cHealth <= 0) ForcePlayerSuicide(client);
			else if (cHealth <= BLEED_BORDER)
			{
				Bleed[client] = true;
				SetEntityHealth(client, cHealth);
				ClientCommand(client,"r_screenoverlay excw/bleed");
				SetBlind(client, 300, 0, {255, 0, 0, 30});
				SetShake(client);
			}
		}	
	}
	return Plugin_Continue;
}


public StopBlood(Handle:event, const String:name[], bool:dontBroadcast){
	decl client;
	Bleed[client = GetClientOfUserId(GetEventInt(event, "userid"))] = false;
	ClientCommand(client,"r_screenoverlay 0");
}

/* Спасибо AlmazON - убиваем глобальный таймер, если все игроки вышли с сервера */
public OnClientDisconnect_Post(client)
{
	Bleed[client] = false;
	for (new i = 1; i <= MaxClients; ++i)
	{
		if (IsClientInGame(i)) return;
	}
	if(g_hTimer != null)
	{
		KillTimer(g_hTimer);
		g_hTimer = null;
	}
}

public PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast){
	new client = GetClientOfUserId(GetEventInt(event, "userid")); 
	if(Bleed[client] == false && client != GetClientOfUserId(GetEventInt(event, "attacker")))
	{
		if (GetEventInt(event, "health") <= BLEED_BORDER)
		{
			if (g_fBleedChance >= GetRandomFloat())
			{
				Bleed[client] = true;
			}
		}
	}
}

/* Функция затемнение экрана */
public SetBlind(client, duration, hold_time, const color[4]) {
    new flags = 0x0001;
    new Handle:message = StartMessageOne("Fade", client);  
    if (message != INVALID_HANDLE)  
    {   
        PbSetInt(message, "duration", duration); // 1 * 300 = 300 - сколько duration поставишь, столько он времени будет светлеть
        PbSetInt(message, "hold_time", hold_time); // Время задержки цвета
        PbSetInt(message, "flags", flags);
        PbSetColor(message, "clr", color); 
        EndMessage();  
    } 
}

/* Функция тряски экрана */
public SetShake(client){
	new Handle:hBf = StartMessageOne("Shake", client);
	if( hBf != INVALID_HANDLE )
	{
		PbSetInt(hBf, "command", 0);
		PbSetFloat(hBf, "local_amplitude", g_fShakeAmp);
		PbSetFloat(hBf, "frequency", 1.0);
		PbSetFloat(hBf, "duration", g_fShakeTime);
		EndMessage();
	}
}
По поводу "убиваем глобальный таймер, если все игроки вышли с сервера" - сомневаюсь, что оно вообще нужно. В этот момент может вызываться конец раунда и таймер убьётся сам. Проверь в CS:GO.

Точно, точно. Когда делал запутался и все оставил как есть. У меня же таймер убивается в конце раунда.. Хотя это можно испоользовать как перестраховку, ведь таймер все равно создается каждый новый раунд.

Добавлено через 5 минут
Чушь? ЗАЕ меня уже , интервал 1.5, шанс 100%, после 70хп, 1хп снимается. вот такие кфг настройки.

мне всодили с мухи на 50 урона. ХЕРАЧИТ ПО 3 хп каждую секунду. я ахинею несу?

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

Не нравится, не используй.
Попросил друзей протестировать плагин, все 7 человек сказали что все нормально.
Нет ни каких заскоков или умножение.

Проверь оптимизированную версию от AlmazON.
 
Последнее редактирование:

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
Вроде раунд не начинается, если нет людей. В общем, надо смотреть в действии.
Ну вот именно. Зачем нам постоянно запущенный таймер? (конкретно для этого плагина) Если его можно убить таким способом, а если нужно он запустится когда начнется новый раунд.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,756
Все вышли - конец раунда, таймер убит. Новый раунд не начинается. Кто-то вдвоём зашёл в команду - начался, таймер пошёл.
Если так, то "не именно". Если не знаешь, как это проверить, так и скажи.
 

Hejter

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

Нет не знаю. Ведь я не так давно работаю с таймерами.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,756
Ведь я не так давно работаю с таймерами.
А они тут и не нужны...
Ладно, пусть будет, а то в CS:GO так "славно" и часто патчат, что сейчас работает так, а потом - эдак. Ненадёжно надеяться на постоянство принципов самой игры.
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
А они тут и не нужны...
Ладно, пусть будет, а то в CS:GO так "славно" и часто патчат, что сейчас работает так, а потом - эдак. Ненадёжно надеяться на постоянство принципов самой игры.

Наконец-то. Кстати у тебя в коде ошибка, проверь.
C-подобный:
bleeding.sp
bleeding.sp(106) : error 012: invalid function call, not a valid address
bleeding.sp(106) : warning 215: expression has no effect
bleeding.sp(106) : error 001: expected token: ";", but found ")"
bleeding.sp(106) : error 029: invalid expression, assumed zero
bleeding.sp(106) : fatal error 187: too many error messages on one line
Done
Что-то связанно с макросом который ты трогал.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,756
у тебя в коде ошибка
Меньше с макросами возиться надо, когда они и не нужны, применяются всего 1 раз. Поменял скобки. Будет ругаться - замени на нормальную строку и всё.
А вообще, я тебе просто показал, что можно и как сжать. А ты сам решай и проверяй, насколько это срабатывает. Там оптимизацией едва ли пахнет.
 
Сверху Снизу