Остановка повторяющегося таймера.

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
Имется простой код граба, который, возможно, с ошибками.
Нужно отключить по команде Ungrab повторяющийся таймер.
Я не уверен в том, что KillTimer останавливает таймер, т.к. после нескольких использований граба начинают подлагивать модели, точнее начинают дёргаться ноги в стороны.
PHP:
#include <sourcemod>
#include <sdktools>
#include <smlib>
#include <sdkhooks>

new Float:difference[MAXPLAYERS+1][3];

new Handle:Timer1;

new entitygrabbed[MAXPLAYERS+1];



public Plugin:myinfo = 
{ 
    name = "dP_BaseBuilder", 
    author = "Primo", 
    description = "Other Mod", 
    version = "1.1", 
} 

public OnPluginStart() 
{
    RegConsoleCmd("grab", OnGrab);
    RegConsoleCmd("ungrab", OnUngrab);
}


public Action:OnUngrab(client, args)
{
	new Float:vec[3] = {0.1, 0.1, 0.1};
	TeleportEntity(entitygrabbed[client], NULL_VECTOR, NULL_VECTOR, vec);
	entitygrabbed[client] = -1;
	KillTimer(Timer1);
    
}

stock TraceClientViewEntity(this)
{
	new Float:m_vecOrigin[3];
	new Float:m_angRotation[3];
	GetClientEyePosition(this, m_vecOrigin);
	GetClientEyeAngles(this, m_angRotation);
	new Handle:tr = TR_TraceRayFilterEx(m_vecOrigin, m_angRotation, MASK_VISIBLE, RayType_Infinite, TRDontHitSelf, this);
	new pEntity = -1;
	if (TR_DidHit(tr))
	{
		pEntity = TR_GetEntityIndex(tr);
		CloseHandle(tr);
		return pEntity;
	}
	CloseHandle(tr);
	return -1;
}

public bool:TRDontHitSelf(entity, mask, any:data)
{
	if (entity == data) return false;
	return true;
}

public Action:OnGrab(client, args)
{
	if(GetUserFlagBits(client) & ADMFLAG_KICK)
	{
		new ent = TraceClientViewEntity(client);
		new String:clEnt[50];
		GetEntityClassname(ent, clEnt, sizeof(clEnt));
		decl Float:playerAng[3];
		decl Float:propAng[3];
		GetClientEyeAngles(client, playerAng);
		Entity_GetAbsAngles(ent, propAng);
		entitygrabbed[client] = ent;

		SubtractVectors(playerAng, propAng, difference[client]);
		Timer1 = CreateTimer(0.1, OnPreThinkS, client, TIMER_REPEAT);
	}
}

public Action:OnPreThinkS(Handle:timer, any:client)
{
    
    new entity = entitygrabbed[client];
	new Float:clvec[3],Float:clpos[3], Float:entpos[3], Float:clang[3];
				
	GetClientAbsOrigin(client, clpos);
		
	GetClientEyeAngles(client, clang);
	
	GetAngleVectors(clang, clvec, NULL_VECTOR, NULL_VECTOR);
	// update object 
	clpos[0] += clvec[0]*100;
	clpos[1] += clvec[1]*100;
	clpos[2] += clvec[2]*100;
	Entity_GetAbsOrigin(entity, entpos);
				
	SubtractVectors(clpos, clvec, entpos);
				
	ScaleVector(entpos, 260.0);
	TeleportEntity(entity, clpos, clang, NULL_VECTOR);
	
}
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #2
Таймер то останавливается, но таймер твой расчитан на 1-го игрока, не на несколько.
 

Primo

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

Добавлено через 43 минуты
Никак не фиксится тот факт, что ноги дёргаются после граба? Причем у всех, даже у тех, кого не трогали.

Добавлено через 1 час 15 минут
Да и таймер, похоже, не останавливается, т.к. в логи спамит ошибку постоянно.
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
KillTimer останавливает таймер
Люди, вы когда-нибудь выучите, что повторяющийся таймер не остановить через KillTimer?! Посмотрите натив, там же написано об этом! KillTimer может использоваться для закрытия Handle такого таймера и не более того!
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #5
надо после KillTimer прировнять его к INVALID_HANDLE;
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
Люди, вы когда-нибудь выучите, что повторяющийся таймер не остановить через KillTimer?! Посмотрите натив, там же написано об этом! KillTimer может использоваться для закрытия Handle такого таймера и не более того!

Это не меня надо было цитировать.
Я и написал именно по этому поводу, т.е. как закрыть повторяющийся таймер :\
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
т.е. как закрыть повторяющийся таймер
"Plugin_Stop to stop a repeating timer, any other value for default behavior.".
надо после KillTimer прировнять его к INVALID_HANDLE;
А если сделано так, что этого не требуется, то есть ли в этом смысл? Освобождает память или нет (KillTimer разве не сделал этого в полной мере)?
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #8
AlmazON, как ты собираешься останавливать таймер до выполнения обратного вызова?
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
до выполнения обратного вызова
Чего, кого? В каком смысле? Повторяющийся таймер не будет остановлен моментально. Сначало идёт его вызов и, если переменная включения false, то не выполняя более действий - остановка. Если ты об этом. Никаких Handle зачастую и не надо, а создавать bool для каждого клиента (если нужно), приравнивая его к нужному значению. Таким образом, не нужно и закрывать (утечки памяти).
есть ли в этом смысл?
А это я тебя спрашиваю, а не утверждаю. Не уверен, что так необходимо и наоборот.
 
Последнее редактирование:
Сверху Снизу