[Sourcepawn][CSS и ZR]Убийство людей в конце раунда

TheRunningMan

Участник
Сообщения
147
Реакции
10
Извините конечно, что задаю много вопросов по поводу программирования, но я не могу понять как исправить....
Вот то, что я написал, возможно можно сделать проще....
PHP:
new Handle:t_timer[MAXPLAYERS+1] = INVALID_HANDLE;   
new Float:g_cvarRoundTime; 
new Float:ForTimer;
new bool: zombie[MAXPLAYERS+1];    
public OnPluginStart()   
{
	HookEvent("round_freeze_end", RoundStart);
	HookEvent("round_end", roundend);
}   

public Action:RoundStart(Handle:event, const String:name[], bool:dontBroadcast)   
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	
	if (t_timer[client] != INVALID_HANDLE) { 
        KillTimer(t_timer[client]); 
        t_timer[client] = INVALID_HANDLE; 
    }
	
	g_cvarRoundTime = GetConVarFloat(FindConVar("mp_roundtime"));
	
	ForTimer = (g_cvarRoundTime*60.0 - 2.0); 
	
	for(new Client = 1; Client <= MaxClients; Client++)  
    {  
        if (IsClientInGame(Client)) 
        { 
            if (IsPlayerAlive(Client))
            {
				if (ZR_IsClientHuman(Client))
				{
					t_timer[Client] = CreateTimer(ForTimer, killer, Client);
					zombie[Client] = false
				}
            }  
        } 
    }
}   

public Action:ZR_OnClientInfect(&client, &attacker, &bool:motherInfect, &bool:respawnOverride, &bool:respawn)
{
	if (t_timer[client] != INVALID_HANDLE) { 
        KillTimer(t_timer[client]); 
        t_timer[client] = INVALID_HANDLE;
	}
	zombie[client] = true;
	
	return Plugin_Continue;
}

public Action: killer(Handle:timer)   
{
	for(new client = 1; client <= MaxClients; client++)  
		{  
			if (IsClientInGame(client)) 
			{ 
				if (IsPlayerAlive(client))
				{
					if (ZR_IsClientHuman(client) && (zombie[client] == false))
					{
						ForcePlayerSuicide(client);
				
						if (t_timer[client] != INVALID_HANDLE) { 
						KillTimer(t_timer[client]); 
						t_timer[client] = INVALID_HANDLE; 
						}
					}
				}
			}
		}
	return Plugin_Handled;   
}

public roundend(Handle:event, const String:name[], bool:dontBroadcast) 
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	
	if (t_timer[client] != INVALID_HANDLE) { 
        KillTimer(t_timer[client]); 
        t_timer[client] = INVALID_HANDLE; 
    }
}
Идея такого, что когда время раунда приближается к 0 людей убивает, зомби остаются в живых, это у меня всегда все работает, но в функции killer есть условие ZR_IsClientHuman(client), он его просто игнорирует(следовательно не убивает), я сделал переменную, котора определят зомб клиент или нет, если ее значение ложь, то его убьет, но это не суть проблемы, главная проблема заключается в том, что по началу таймер срабатывает вовремя, но спустя несколько игр, он начинает жестоко тупить, и убивает то сразу после начала раунда, то секунд через 30(когда время раунда 2 минуты)или через минут, вообщем срабатывает раньше времени.....

P.S. Подскажите разбирающиеся люди имеющие опыт в программировании для игры CS Source!
 
Последнее редактирование:

FrozDark

Участник
Сообщения
1,769
Реакции
2,050
PHP:
new Handle:hTimer;
new Handle:mp_roundtime;

public OnPluginStart()
{ 
    HookEvent("round_start", RoundStart); 
    HookEvent("round_freeze_end", RoundStart);
    mp_roundtime = FindConVar("mp_roundtime");
    if (mp_roundtime == INVALID_HANDLE)
        SetFailState("Couldn't find 'mp_roundtime' cvar");
}

public OnMapEnd()
    hTimer = INVALID_HANDLE;

public RoundStart(Handle:event, const String:name[], bool:dontBroadcast)    
{ 
    new client = GetClientOfUserId(GetEventInt(event, "userid")); 
     
    if (hTimer != INVALID_HANDLE) {  
        KillTimer(hTimer);  
        hTimer = INVALID_HANDLE;  
    } 
     
    hTimer = CreateTimer(GetConVarFloat(mp_roundtime)*60.0 - 1.0, OnRoundEnd, _, TIMER_FLAG_NO_MAPCHANGE);
}

public Action:OnRoundEnd(Handle:timer)    
{ 
    for(new client = 1; client <= MaxClients; client++)   
    {   
        if (IsClientInGame(client) && IsPlayerAlive(client) && ZR_IsClientHuman(client))  
            ForcePlayerSuicide(client); 
    }
    hTimer = INVALID_HANDLE;
    return Plugin_Stop;    
}
 

Fab3r

Участник
Сообщения
1,520
Реакции
366
TheRunningMan, код под spoiler спрячь, и на форуме большие коды не выкладывай без спойлера!
 

TheRunningMan

Участник
Сообщения
147
Реакции
10
PHP:
new Handle:hTimer;
new Handle:mp_roundtime;

public OnPluginStart()
{ 
    HookEvent("round_start", RoundStart); 
    HookEvent("round_freeze_end", RoundStart);
    mp_roundtime = FindConVar("mp_roundtime");
    if (mp_roundtime == INVALID_HANDLE)
        SetFailState("Couldn't find 'mp_roundtime' cvar");
}

public OnMapEnd()
    hTimer = INVALID_HANDLE;

public RoundStart(Handle:event, const String:name[], bool:dontBroadcast)    
{ 
    new client = GetClientOfUserId(GetEventInt(event, "userid")); 
     
    if (hTimer != INVALID_HANDLE) {  
        KillTimer(hTimer);  
        hTimer = INVALID_HANDLE;  
    } 
     
    hTimer = CreateTimer(GetConVarFloat(mp_roundtime)*60.0 - 1.0, OnRoundEnd, _, TIMER_FLAG_NO_MAPCHANGE);
}

public Action:OnRoundEnd(Handle:timer)    
{ 
    for(new client = 1; client <= MaxClients; client++)   
    {   
        if (IsClientInGame(client) && IsPlayerAlive(client) && ZR_IsClientHuman(client))  
            ForcePlayerSuicide(client); 
    }
    hTimer = INVALID_HANDLE;
    return Plugin_Stop;    
}

Потестил(с ботами), вроде убивает вовремя, но когда я остаюсь одни человеком, плагин почемуто убивает меня и зомби-ботов тоже....
Потестил с льдьми, все также....
Получается что он игнорирует условие что клиент должен быть зомби...
 
Последнее редактирование:
Сверху Снизу