Таймеры или Убийство Людей в конце раунда

TheRunningMan

Участник
Сообщения
147
Реакции
10
И снова здравствуйте!))
В общем, очень давно уже пытаюсь сделать плагин Zombie Reloaded убивающий живых людей если время раунда вышло, но в первом моем коде, на тестовом сервере все норм, на котором надо не пашет, второй код, тоже самое, хотя и получился гораздо проще, сейчас я уже близок к истине, но есть баги, такие как убийство после начала раунда, или чуть раньше чем надо.....
Короче я уже не могу))) Придется выложить код, чтобы разобраться, хотя мне этого не очень хочется))

PHP:
public OnPluginStart()   
{
	HookEvent("round_freeze_end", RoundStart);
	HookEvent("round_end", roundend);
	HookEvent("player_spawn", pspawn);
}   

public Action:RoundStart(Handle:event, const String:name[], bool:dontBroadcast)   
{	
	
	getroundtime = (GetConVarFloat(FindConVar("mp_roundtime"))*60.0);
	
	fakeround = (getroundtime - 2.0);
	
	timekill =false;
	
	for(new j = 1; j <= MaxClients; j++)
	{
		if (IsClientInGame(j))
		{
			if (IsPlayerAlive(j))
			{
				
				TimerKill[j] = CreateTimer(fakeround, Kill, j);
				PrintToChat (j, "Timer");
			}
		}
	}

	
	PrintToChatAll ("getroundtime %f", getroundtime);
	PrintToChatAll ("fakeround %f",fakeround);
}   

public pspawn(Handle:event,const String:name[],bool:dontBroadcast) 
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	
	if (IsClientInGame(client)) 
		{ 
			if (IsPlayerAlive(client))
			{
				if (ZR_IsClientHuman(client))
				{
					if (TimerKill[client] != INVALID_HANDLE) { 
						KillTimer(TimerKill[client]); 
						TimerKill[client] = INVALID_HANDLE;
					}
				}
			}
		}
}

public Action: Kill(Handle:timer, any: client)   
{
	KillHumans();
}

KillHumans()
{
	KillAllTimers();
	if (timekill == true)
	{
		for(new i = 1; i <= MaxClients; i++)  
		{
			if (IsClientInGame(i)) 
			{ 
				if (IsPlayerAlive(i))
				{
					if(ZR_IsClientZombie(i))
					{
						SlapPlayer(i, 0, false);
						PrintToChat(i,"Slap 0");
					}else
					{
						SlapPlayer(i, 300, false);
						PrintToChat(i,"Slap 300");
					}
					
				}
			}
		}
	}
}

KillAllTimers()
{
	for(new c = 1; c <= MaxClients; c++)  
	{
		if (IsClientInGame(c)) 
		{ 
			if (IsPlayerAlive(c))
			{
				if (TimerKill[c] != INVALID_HANDLE) { 
				KillTimer(TimerKill[c]); 
				TimerKill[c] = INVALID_HANDLE;
				}
			}
		}
	}
	
	timekill = true;
}


public roundend(Handle:event, const String:name[], bool:dontBroadcast) 
{
	KillAllTimers();
}

public OnClientDisconnect(client)
{
	if (TimerKill[client] != INVALID_HANDLE) { 
        KillTimer(TimerKill[client]); 
        TimerKill[client] = INVALID_HANDLE;
	}
}


Тамеры меня доканали, надо с ними разобраться че кого, также у меня есть другой плагин , суть которого заключается в том, что зомбы имеют один Отравленный дротик(мое название:) ) , который они кидают в человека, при этом у жертвы, искажается экран, меняется разными цветами, НО и очень больше НО очень часто бывает что если тебя травят, то эфект искажения то появляется то исчезает, либо вообще сам эфект отравления мелькнет на секунду и все, как будто таймер запустился и тут же убился...
 

semjef

semjef.ru
Сообщения
993
Реакции
444
помоему проще будет так:

PHP:
new Handle:TimerToRoundEnd;

public OnPluginStart()
{	
	HookEvent("round_start", RoundStart);
}

public Action:RoundStart(Handle:event, const String:name[], bool:dontBroadcast)    
{ 
	if (TimerToRoundEnd != INVALID_HANDLE)
	{
		CloseHandle(TimerToRoundEnd);
		TimerToRoundEnd = INVALID_HANDLE;
	}
	TimerToRoundEnd = CreateTimer((GetConVarFloat(FindConVar("mp_roundtime")) * 60.0) - GetConVarFloat(FindConVar("mp_freezetime")), OnTimerToRoundEnd);
}

public Action:OnTimerToRoundEnd(Handle:timer)
{
	for (new i=1;i<=256;i++)
	{
		if (IsClientInGame(i))
		{
			if (GetClientTeam(i) == 3)
			{	
				ForcePlayerSuicide(i);
			}			
		}
	}
}

должно работать))
 

TheRunningMan

Участник
Сообщения
147
Реакции
10
помоему проще будет так:

PHP:
new Handle:TimerToRoundEnd;

public OnPluginStart()
{	
	HookEvent("round_start", RoundStart);
}

public Action:RoundStart(Handle:event, const String:name[], bool:dontBroadcast)    
{ 
	if (TimerToRoundEnd != INVALID_HANDLE)
	{
		CloseHandle(TimerToRoundEnd);
		TimerToRoundEnd = INVALID_HANDLE;
	}
	TimerToRoundEnd = CreateTimer((GetConVarFloat(FindConVar("mp_roundtime")) * 60.0) - GetConVarFloat(FindConVar("mp_freezetime")), OnTimerToRoundEnd);
}

public Action:OnTimerToRoundEnd(Handle:timer)
{
	for (new i=1;i<=256;i++)
	{
		if (IsClientInGame(i))
		{
			if (GetClientTeam(i) == 3)
			{	
				ForcePlayerSuicide(i);
			}			
		}
	}
}

должно работать))

Должно но не обязано, не все так, просто....
Это зомби мо а не простая контра...как пишет автор мода, там не полностью идет преобразование из контра в тера или из тера коньтра, т.е. если ты был в начале раунда тером, кто-то стал зомбов и ты видишь себя в списке КТ, то это далеко на значит что, ты КТ)))
По моду есть Люди, а есть Зомби...
Тем более я пробывалс получением команды клиента, убивал всех
Вы не поняли суть вопроса, не важно каким методом убивать людей, важно сделать правильный расчет таймера, его чистку и создание....
Также если вы расчитаете полностью время раунда, возможно он и убьет людей,но победа будет за людьми...следовательно, надо убивать на 1-2 секунды раньше чем время кончится....(на данный момент если кончилось время раунда автоматически побеждают люди, но на ЗЕ картах это глупо)
 

semjef

semjef.ru
Сообщения
993
Реакции
444
тогда юзай TerminateRound(0.0, 9); - точно как юзать не помню, но вот эта ф-ция устраивает победу в раунде одной из команд. (8 - контры выигрывают, 9 - теры)
 

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

Админ uaplayer.com
Сообщения
240
Реакции
340
PHP:
enum CSRoundEndReason
{
	CSRoundEnd_TargetBombed = 0,           // Target Successfully Bombed!
	CSRoundEnd_VIPEscaped,                 // The VIP has escaped!
	CSRoundEnd_VIPKilled,                  // VIP has been assassinated!
	CSRoundEnd_TerroristsEscaped,          // The terrorists have escaped!
	CSRoundEnd_CTStoppedEscape,            // The CTs have prevented most of the terrorists from escaping!
	CSRoundEnd_TerroristsStopped,          // Escaping terrorists have all been neutralized!
	CSRoundEnd_BombDefused,                // The bomb has been defused!
	CSRoundEnd_CTWin,                      // Counter-Terrorists Win!
	CSRoundEnd_TerroristWin,               // Terrorists Win!
	CSRoundEnd_Draw,                       // Round Draw!
	CSRoundEnd_HostagesRescued,            // All Hostages have been rescued!
	CSRoundEnd_TargetSaved,                // Target has been saved!
	CSRoundEnd_HostagesNotRescued,         // Hostages have not been rescued!
	CSRoundEnd_TerroristsNotEscaped,       // Terrorists have not escaped!
	CSRoundEnd_VIPNotEscaped,              // VIP has not escaped!
	CSRoundEnd_GameStart                   // Game Commencing!
};

Вот сама функция. Не пойму, чё сложного то?

А с дротиками что не получается? Тебе объяснить как делать? Создаёш летящий дротик, хукаеш его через SDKHook_StartTouch, если попал в кого надо, то шейк и оверлей какой-нибудь наложить можно. Ну или через фейд озеленить монитор виктиму или ещё что-нибудь на подобе.
 

TheRunningMan

Участник
Сообщения
147
Реакции
10
PHP:
enum CSRoundEndReason
{
	CSRoundEnd_TargetBombed = 0,           // Target Successfully Bombed!
	CSRoundEnd_VIPEscaped,                 // The VIP has escaped!
	CSRoundEnd_VIPKilled,                  // VIP has been assassinated!
	CSRoundEnd_TerroristsEscaped,          // The terrorists have escaped!
	CSRoundEnd_CTStoppedEscape,            // The CTs have prevented most of the terrorists from escaping!
	CSRoundEnd_TerroristsStopped,          // Escaping terrorists have all been neutralized!
	CSRoundEnd_BombDefused,                // The bomb has been defused!
	CSRoundEnd_CTWin,                      // Counter-Terrorists Win!
	CSRoundEnd_TerroristWin,               // Terrorists Win!
	CSRoundEnd_Draw,                       // Round Draw!
	CSRoundEnd_HostagesRescued,            // All Hostages have been rescued!
	CSRoundEnd_TargetSaved,                // Target has been saved!
	CSRoundEnd_HostagesNotRescued,         // Hostages have not been rescued!
	CSRoundEnd_TerroristsNotEscaped,       // Terrorists have not escaped!
	CSRoundEnd_VIPNotEscaped,              // VIP has not escaped!
	CSRoundEnd_GameStart                   // Game Commencing!
};

Вот сама функция. Не пойму, чё сложного то?

А с дротиками что не получается? Тебе объяснить как делать? Создаёш летящий дротик, хукаеш его через SDKHook_StartTouch, если попал в кого надо, то шейк и оверлей какой-нибудь наложить можно. Ну или через фейд озеленить монитор виктиму или ещё что-нибудь на подобе.

нет дротики я уже давно сделал))просто с таймерами там проблемы блыи, щас вроде ошибок не выдает, надо на серваке потестить....
А вообще у меня эфект у жертвы такой: цвета меняются, экран эскажен и стянут в цетр и трясется экран, еще звук добавлю, такойже как при заражении людей, чтоб немного побоялся)))

Добавлено через 3 минуты
И кстати мы даже просили нам написать такой плагин, вот этого типА neatek, но че то он не смог))также просили SideX стату то корявую написал, она работает но хренова...вот так...

Добавлено через 42 минуты
Можете мне объяснить еще на счет таймеро НЕповторяющихся, их вообще нужно убивать, вот я это делаю и в консоли сервера всегда на это указывается типо, убивается таймер который уже убит?
 
Последнее редактирование:

neatek

Участник
Сообщения
424
Реакции
225
Добавлено через 3 минуты
И кстати мы даже просили нам написать такой плагин, вот этого типА neatek, но че то он не смог))
Эт ты спецом написал чтоб меня задеть? У меня багаж стал больше, насчет ZR. Видимо тебе уже помогли ,если нет пиши в скайп
 

TheRunningMan

Участник
Сообщения
147
Реакции
10
Эт ты спецом написал чтоб меня задеть? У меня багаж стал больше, насчет ZR. Видимо тебе уже помогли ,если нет пиши в скайп

Да, нет просто говорю как было))
Я видел твои плагины... А скайпа нет у меня))
 

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

Админ uaplayer.com
Сообщения
240
Реакции
340
Можете мне объяснить еще на счет таймеро НЕповторяющихся, их вообще нужно убивать, вот я это делаю и в консоли сервера всегда на это указывается типо, убивается таймер который уже убит?
Ты вопрос ставь более понятно. Если таймер не убивать, то он будет срабатывать, и срабатывать будет не обязательно в том раунде, в котором он был запущен. Честно, не знаю правильно ли это, но я в коллбеках таймеров присваиваю таймерам INVALID_HANDLE, потому-что зачастую таймеры после срабатывания не равны INVALID_HANDLE тобиш 0, и при попытке убить сработавшие таймеры сразу начинает засирать логи.
 

TheRunningMan

Участник
Сообщения
147
Реакции
10
Ну вот я создал как только начался раунд таймер на 10 секунд например, после которых например напишет в чат "прошло 10 секунд", если раунд закончился тут же после того как начился, то в следующем раунде получается в чат напишется "прошло 10 секунд" еще до начала раунда (началом раунда я счтаю когда прошло фризитайм) так?
Для это в событии round_end я пишу если таймер не INVALID_HANDLE, то убить таймер и присвоить ему INVALID_HANDLE, это правильно?
 

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

Админ uaplayer.com
Сообщения
240
Реакции
340
Ну вот я создал как только начался раунд таймер на 10 секунд например, после которых например напишет в чат "прошло 10 секунд", если раунд закончился тут же после того как начился, то в следующем раунде получается в чат напишется "прошло 10 секунд" еще до начала раунда (началом раунда я счтаю когда прошло фризитайм) так?
Для это в событии round_end я пишу если таймер не INVALID_HANDLE, то убить таймер и присвоить ему INVALID_HANDLE, это правильно?

Да, но если таймер успел сработать, то его значение не обязательно равно INVALID_HANDLE, и в таком случае в хуке евента round_end ты пытаешся убить сработавший таймер.
 

TheRunningMan

Участник
Сообщения
147
Реакции
10
Да, но если таймер успел сработать, то его значение не обязательно равно INVALID_HANDLE, и в таком случае в хуке евента round_end ты пытаешся убить сработавший таймер.

Тогда в консоли сервера будет ошибка, как тогда быть?
 

TheRunningMan

Участник
Сообщения
147
Реакции
10
Я уже сказал, добисать в коллбек таймера

PHP:
if (TimerKill[client] != INVALID_HANDLE) 
{  
    KillTimer(TimerKill[client]);  
    TimerKill[client] = INVALID_HANDLE; 
}

ну
я же так и написал если не равено то ....
Я также писал в других плагинах мне все равно писалось что таймер уже убит и указывад на строчку KIllTimer
 
Сверху Снизу