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

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
64 * 3 = до 192 раз... Оффтоп

Оффтоп
 

R1KO

fuck society
Сообщения
9,460
Реакции
7,799
  • Команда форума
  • #22
Hejter, он взял по максимуму, когда все 64 игрока имеют активными 3 таймера
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,756
Какой ещё any?! Смотри, ты написал:
PHP:
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 excw/bleed");
			EmitSoundToClientAny(client, g_szHeartbeatSound);
			return Plugin_Continue; 
		}
		 		
		ForcePlayerSuicide(client); 	
		Bleed[client] = false;	
		func_killtimer(client);
		func_blindkilltimer(client);
		func_shakekilltimer(client);
	} 
	return Plugin_Stop; 
}
Переводим на цикл, приблизительно:
PHP:
public Action:Bleed_Timer(Handle:timer){
	for (new client = 1; client <= MaxClients; ++client)
	{
		if (IsClientInGame(client) && IsPlayerAlive(client) && Bleed[client])
		{
			new cHealth = GetClientHealth(client) - MINUS_BLEED_HP;
			if (cHealth > 0){ 
				SetEntityHealth(client, cHealth);
				ClientCommand(client,"r_screenoverlay excw/bleed");
				EmitSoundToClientAny(client, g_szHeartbeatSound);
				return Plugin_Continue; 
			}
		 		
			ForcePlayerSuicide(client); 	
			Bleed[client] = false;
		}
	}
	return Plugin_Continue; 
}
Это упрощённый путь: всего 3 таймера максимум. Однако, гораздо выгодней слить всё в 1, но отдельно настроить на эффекты уже будет нельзя.
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
Какой ещё any?! Смотри, ты написал:
PHP:
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 excw/bleed");
			EmitSoundToClientAny(client, g_szHeartbeatSound);
			return Plugin_Continue; 
		}
		 		
		ForcePlayerSuicide(client); 	
		Bleed[client] = false;	
		func_killtimer(client);
		func_blindkilltimer(client);
		func_shakekilltimer(client);
	} 
	return Plugin_Stop; 
}
Переводим на цикл, приблизительно:
PHP:
public Action:Bleed_Timer(Handle:timer){
	for (new client = 1; client <= MaxClients; ++client)
	{
		if (IsClientInGame(client) && IsPlayerAlive(client) && Bleed[client])
		{
			new cHealth = GetClientHealth(client) - MINUS_BLEED_HP;
			if (cHealth > 0){ 
				SetEntityHealth(client, cHealth);
				ClientCommand(client,"r_screenoverlay excw/bleed");
				EmitSoundToClientAny(client, g_szHeartbeatSound);
				return Plugin_Continue; 
			}
		 		
			ForcePlayerSuicide(client); 	
			Bleed[client] = false;
		}
	}
	return Plugin_Continue; 
}
Это упрощённый путь: всего 3 таймера максимум. Однако, гораздо выгодней слить всё в 1, но отдельно настроить на эффекты уже будет нельзя.

Оффтоп
Все таки наверное сделаю 1 таймер с циклом, так думаю будет лучше.
 

DarklSide

Участник
Сообщения
931
Реакции
468
и так и так нет сердцебиения.

В недавнем, было сделано видео для стандартного "EmitSoundToClient" - http://hlmod.ru/forum/showpost.php?p=205567&postcount=41.

P.S.: так же, если быть внимательней, был добавлен не пустой камментарий после (g_hConVar_szHeartbeatSound = CreateConVar):

// new path [sound/]excw[k]
- где добавлена в путь символ k, для временного использования.
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
В недавнем, было сделано видео для стандартного "EmitSoundToClient".

P.S.: так же, если быть внимательней, был добавлен не пустой камментарий после (g_hConVar_szHeartbeatSound = CreateConVar):

// new path [sound/]excw[k]
- где добавлена в путь символ k, для временного использования.

Видел я этот комментарий и путь поменял на свой, проверил не работает. Так же потом все вернул(пути) и опять проверил и опять не работает.
Возможно звук БАГанный.
 

AlmazON

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

Hejter

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

Ну понятно. Сделаю один общий таймер и посмотрю что будет.
Так мне надо убивать таймер с циклом? Кроме как return plugin_stop;

Добавлено через 22 минуты
Сделал по циклу, но заметил такой баг.
Таймер бывает два раза срабатывает.
Т.е место снятие X хп у игрока, он снимает X2 раза.

PHP:
#pragma semicolon 1

#include <sdkhooks>
#include <sdktools>

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

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

new Float:g_fShakeAmp;
new Float:g_fShakeTime;

new String:g_szHeartbeatSound[256];
new Handle:g_hConVar_szHeartbeatSound = INVALID_HANDLE;

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.6",
	url = "hlmod.ru & excw.ru",
}

public OnPluginStart(){
	BleedChance = CreateConVar("sm_bleeding_chance", "0.25", "Шанс кровотечения, 1.00 = 100%, 0.50 = 50%, и т.д", FCVAR_PLUGIN);
	g_hConVar_szHeartbeatSound = CreateConVar("sm_heartbeat_sound", "sound/excw/heart.mp3", "звук сердцебиения (относительно sound/)");
	g_hConVar_fShakeAmp			= CreateConVar("sm_heartbeat_shakeamp", 	"7.0", 						"Сила тряски экрана");
	g_hConVar_fShakeTime		= CreateConVar("sm_heartbeat_shaketime", 	"3.0", 							"промежуток тряски экрана");
	
	HookConVarChange(g_hConVar_szHeartbeatSound, 	ConVar_Callback);
	HookConVarChange(g_hConVar_fShakeAmp, 			ConVar_Callback);
	HookConVarChange(g_hConVar_fShakeTime, 			ConVar_Callback);
	
	GetConVarString(g_hConVar_szHeartbeatSound, g_szHeartbeatSound, sizeof(g_szHeartbeatSound));
	
	g_fShakeAmp			= GetConVarFloat(g_hConVar_fShakeAmp);
	g_fShakeTime		= GetConVarFloat(g_hConVar_fShakeTime);
	
	HookEvent("player_death", PlayerDeath);
	HookEvent("player_hurt", PlayerHurt);
	HookEvent("player_spawn", PlayerSpawn);
	
	AutoExecConfig(true, "sm_bleeding");
}

public OnMapStart()
{
	AddFileToDownloadsTable(g_szHeartbeatSound);
	ReplaceString(g_szHeartbeatSound, sizeof(g_szHeartbeatSound), "sound", "*");
	PrecacheSound(g_szHeartbeatSound);
	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_szHeartbeatSound )
	{
		GetConVarString(g_hConVar_szHeartbeatSound, g_szHeartbeatSound, sizeof(g_szHeartbeatSound));
	}
	else if ( cvar == g_hConVar_fShakeAmp )
	{
		g_fShakeAmp = GetConVarFloat(g_hConVar_fShakeAmp);
	}
	else if ( cvar == g_hConVar_fShakeTime )
	{
		g_fShakeTime = GetConVarFloat(g_hConVar_fShakeTime);
	}
}

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");
	}
	func_killtimer(client);
}

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");
	} 
	
	func_killtimer(client);
}

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

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

public 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)
			{
				BleedTimerKill[client] = CreateTimer(BLEED_TIMER, Bleed_Timer, GetClientUserId(client), TIMER_REPEAT); // Кровотечение
				Bleed[client] = true;
			}
		}
	}
}

public Action:Bleed_Timer(Handle:timer){ 
	for (new client = 1; client <= MaxClients; ++client)
	{
		if (IsClientInGame(client) && IsPlayerAlive(client) && Bleed[client])
		{ 
			new cHealth = GetClientHealth(client) - MINUS_BLEED_HP;
			if (cHealth > 0){ 
				SetEntityHealth(client, cHealth);
				ClientCommand(client,"r_screenoverlay excw/bleed");
				SetBlind(client, 300, 0, {255, 0, 0, 30});
				SetShake(client);
				EmitSoundToClient(client, g_szHeartbeatSound);
				return Plugin_Continue; 
			}
			 		
			ForcePlayerSuicide(client); 	
			Bleed[client] = false;
			func_killtimer(client);
		}
	}		
	return Plugin_Stop; 
}  

/* Функция затемнение экрана */
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();
	}
}

/* Убиваем таймер - кровотечение */
public func_killtimer(client){
	if(BleedTimerKill[client]) 
	{ 
		KillTimer(BleedTimerKill[client]); 
		BleedTimerKill[client] = INVALID_HANDLE; 
	}
}
 
Последнее редактирование:

maize

Участник
Сообщения
100
Реакции
7
Протестировал на CSGO, все работает идеально, через нотепад настроил квары через сколько хп будет отнимать здоровье, настроил после 70хп, все ок, скомпилил, работает идеально.
Каждый из пунктов работает идеально, кроме mp3, при сердцебиении не пашет звук, + файлик mp3 вечно подгружается, но не загружается на 100%, после каждой карты он висит в загрузке 2 сек, но не звучит в игре.
+ еще мп3, файлик который не загружается и не работает каким-то образом блочит музыку после раунда, тоесть если на тебе блид и конец раунда, песня звучит не 5 секунд , а 1 и обрывается, происходит конфликт между блид и мп3- которого нету.
Подскажи, как убрать вообще мп3 из плагина, скачку, квары, чтобы не было конфликта. Грамотно убрать, и чтобы не было дурацкой подгрузки мп3.
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
Протестировал на CSGO, все работает идеально, через нотепад настроил квары через сколько хп будет отнимать здоровье, настроил после 70хп, все ок, скомпилил, работает идеально.
Каждый из пунктов работает идеально, кроме mp3, при сердцебиении не пашет звук, + файлик mp3 вечно подгружается, но не загружается на 100%, после каждой карты он висит в загрузке 2 сек, но не звучит в игре.
+ еще мп3, файлик который не загружается и не работает каким-то образом блочит музыку после раунда, тоесть если на тебе блид и конец раунда, песня звучит не 5 секунд , а 1 и обрывается, происходит конфликт между блид и мп3- которого нету.
Подскажи, как убрать вообще мп3 из плагина, скачку, квары, чтобы не было конфликта. Грамотно убрать, и чтобы не было дурацкой подгрузки мп3.

Удали путь до звука сердцебиения и там создается CFG в cfg/sourcemod вроде sm_bleeding вот его удалишь и проверяй или сразу удаляй в конфиге.
Укажи какую версию тестировал.

Второй способ.
Скачать sm_downloader и туда прописать звук сердцебиения.
 
Последнее редактирование:

maize

Участник
Сообщения
100
Реакции
7
Удали путь до звука сердцебиения и там создается CFG в cfg/sourcemod вроде sm_bleeding вот его удалишь и проверяй или сразу удаляй в конфиге.
Укажи какую версию тестировал.

Второй способ.
Скачать sm_downloader и туда прописать звук сердцебиения.

0.7 новую

Добавлено через 2 минуты
Удали путь до звука сердцебиения и там создается CFG в cfg/sourcemod вроде sm_bleeding вот его удалишь и проверяй или сразу удаляй в конфиге.
Укажи какую версию тестировал.

Второй способ.
Скачать sm_downloader и туда прописать звук сердцебиения.

Я новичок в этом, можешь выложить без мп3 плиз? А то я чет еще не-то удалю из плагина... не хочу пути обрывать, желательно версию без мп3 вообще.
 
Последнее редактирование:

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
0.7 новую

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


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

Обновил первый пост темы, качай.
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
Сейчас без саунда? без мп3? просто качать я буду, мне еще в нотепаде 70% делать квар , после которого начинается блид.

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

maize

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

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

тестирую данную версию, музыки нету, конфликтов нету.

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

от 70 он по 1 фигачит, 1 у меня переменная сколько здоровья в секу отнимет

после 50 1.5 бьет

после 35 по 2

после 25 по 2.5-3.0

Прошу помощи (

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

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
Я в кваре делаю после 70 начинается убавление хп, а не после 30, иначе не интересно. но не суть.

тестирую данную версию, музыки нету, конфликтов нету.

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

от 70 он по 1 фигачит, 1 у меня переменная сколько здоровья в секу отнимет

после 50 1.5 бьет

после 35 по 2

после 25 по 2.5-3.0

Прошу помощи (

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

Попробуй удалить старый конфиг sm_bleeding в cfg/sourcemod.
т.к такой проблемы не встречал.
 

R1KO

fuck society
Сообщения
9,460
Реакции
7,799
  • Команда форума
  • #38
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 тоже не паблик функции
 

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 тоже не паблик функции
Ну я не знаю и так все работает :P
Функция шанс с рандомом брал с какого-то популярного скрипта, вроде от _root

Так будет правильнее?
PHP:
CheckPlayer(client)
{
	new Float:iBleedChance = GetConVarFloat(BleedChance);
	new Float:iRoll = GetRandomFloat();
	if (IsClientInGame(client) && IsPlayerAlive(client) && Bleed[client])
	{
		new cHealth = GetClientHealth(client) - MINUS_BLEED_HP;

и

PHP:
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();  
    } 
}

Каллбек тоже смотрел с какого-то скрипта.
Проверку на IsClientInGame делал еще для старого плагина кровотечение, когда не было цикла.
 

pracc

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