Проверить значение квара и таймер от старта раунда по 1 секунде отсчётВсем привет, подскажите пожалуйста, как сделать проверку на то вышло ли время закупа
Не думал с этой точки зрения. Хорошо понял, спасибоПроверить значение квара и таймер от старта раунда по 1 секунде отсчёт
Подскажите пожалуйста, как это реализоватьПроверить значение квара и таймер от старта раунда по 1 секунде отсчёт
"mp_buytime" = "1.5" ( def. "1.5" ) min. 0.250000
game replicated
- How many minutes after round start players can buy items for.
round_start?Не думал с этой точки зрения. Хорошо понял, спасибо
Сообщения автоматически склеены:
Подскажите пожалуйста, как это реализовать
float globalCounter = 0.0;
Handle g_hTimer;
public void OnPluginStart()
{
HookEvent("round_start", rs);
}
public void rs(Event hEvent, const char[] sEvent, bool bdb)
{
globalCounter = 0.0;
if(g_hTimer != null) delete g_hTimer;
g_hTimer = null;
g_hTimer = CreateTimer(0.1, Updater, _, TIMER_REPEAT);
}
public Action Updater(Handle hTimer)
{
globalCounter++;
if(globalCounter >= GetConVarFloat(FindConVar("mp_buytime")))
{
if(g_hTimer != null) delete g_hTimer;
g_hTimer = null;
PrintToChatAll("Закуп запрещен!");
return Plugin_Stop;
}
return Plugin_Continue;
}
Спасибо большоеC-подобный:float globalCounter = 0.0; Handle g_hTimer; public void OnPluginStart() { HookEvent("round_start", rs); } public void rs(Event hEvent, const char[] sEvent, bool bdb) { globalCounter = 0.0; if(g_hTimer != null) delete g_hTimer; g_hTimer = null; g_hTimer = CreateTimer(0.1, Updater, _, TIMER_REPEAT); } public Action Updater(Handle hTimer) { globalCounter++; if(globalCounter >= GetConVarFloat(FindConVar("mp_buytime"))) { if(g_hTimer != null) delete g_hTimer; g_hTimer = null; PrintToChatAll("Закуп запрещен!"); } return Plugin_Continue; }
Это не решение, а просто пример чтобы ты знал, про что примерно тебе говорятСпасибо большое
Понял спасибоЭто не решение, а просто пример чтобы ты знал, про что примерно тебе говорят
#pragma semicolon 1
#pragma newdecls required
Handle hTimer;
public void OnPluginStart()
{
HookEvent("round_start", Event_Start);
}
public void Event_Start(Event event, const char[] name, bool dontBroadcast)
{
if(hTimer) CloseHandle(hTimer);
static ConVar hCVar;
if(hCVar || (hCVar = FindConVar("mp_buytime"))) hTimer = CreateTimer(hCVar.FloatValue * 60, Timer_End);
}
public Action Timer_End(Handle timer)
{
hTimer = null;
PrintToChatAll("Закуп запрещен!");
return Plugin_Stop;
}
Спасибо большое, уже разобрался@7pElllHuK, что именно?
Отлов значения переменной?
Отлов событияC-подобный:"mp_buytime" = "1.5" ( def. "1.5" ) min. 0.250000 game replicated - How many minutes after round start players can buy items for.round_start?
Или создание таймера?
Подскажите пожалуйтста, в чем разница между timer = INVALID_HANDLE и timer = null@Palonez, строки 14, и 25 можно удалить.
Таймер у тебя срабатывает 10 раз в секунду, а у квара значение в минутах.
Кроме того эффект изменения значения квара почуствуется только в следующем раунде, емнип. Поэтому значение квара лучше получать в момент запуска таймера и сохранять во float. И с ним уже сравнивать значение счётчика.
Но лучше сохранить не значение квара, а время когда таймер должен остановиться. =)
Это в случае если нужно реализовать отсчёт.
Если же требуется только сообщить об окончании, то достаточно будет вот этого:C-подобный:#pragma semicolon 1 #pragma newdecls required Handle hTimer; public void OnPluginStart() { HookEvent("round_start", Event_Start); } public void Event_Start(Event event, const char[] name, bool dontBroadcast) { if(hTimer) CloseHandle(hTimer); static ConVar hCVar; if(hCVar || (hCVar = FindConVar("mp_buytime"))) hTimer = CreateTimer(hCVar.FloatValue * 60, Timer_End); } public Action Timer_End(Handle timer) { hTimer = null; PrintToChatAll("Закуп запрещен!"); return Plugin_Stop; }
в чем разница между timer = INVALID_HANDLE и timer = null
INVALID_HANDLE - это запись согласно старому синтакису, а null - новому:This page was last edited on 4 February 2015, at 18:52 Т.е. новому синтаксису уже больше 8 лет.нет, не одно и то же:в чем разница между CloseHandle и KillTimer
Вроде все одно и тоже
/**
* Closes a Handle. If the handle has multiple copies open,
* it is not destroyed unless all copies are closed.
*
* @note Closing a Handle has a different meaning for each Handle type. Make
* sure you read the documentation on whatever provided the Handle.
*
* @param hndl Handle to close.
* @error Invalid handles will cause a run time error.
*/
native void CloseHandle(Handle hndl);
/**
* Kills a timer. Use this instead of CloseHandle() if you need more options.
*
* @param timer Timer Handle to kill.
* @param autoClose If autoClose is true, the data that was passed to CreateTimer() will
* be closed as a handle if TIMER_DATA_HNDL_CLOSE was not specified.
* @error Invalid handles will cause a run time error.
*/
native void KillTimer(Handle timer, bool autoClose=false);
Спасибо большоеINVALID_HANDLE- это запись согласно старому синтакису, аnull- новому:
Кстати:SourceMod 1.7.0 Release Notes - AlliedModders Wiki
wiki.alliedmods.netThis page was last edited on 4 February 2015, at 18:52Т.е. новому синтаксису уже больше 8 лет.
нет, не одно и то же:C-подобный:/** * Closes a Handle. If the handle has multiple copies open, * it is not destroyed unless all copies are closed. * * @note Closing a Handle has a different meaning for each Handle type. Make * sure you read the documentation on whatever provided the Handle. * * @param hndl Handle to close. * @error Invalid handles will cause a run time error. */ native void CloseHandle(Handle hndl);![]()
sourcemod/core/logic/smn_handles.cpp at master · alliedmodders/sourcemod
SourceMod - Source Engine Scripting and Administration - alliedmodders/sourcemodgithub.comC-подобный:/** * Kills a timer. Use this instead of CloseHandle() if you need more options. * * @param timer Timer Handle to kill. * @param autoClose If autoClose is true, the data that was passed to CreateTimer() will * be closed as a handle if TIMER_DATA_HNDL_CLOSE was not specified. * @error Invalid handles will cause a run time error. */ native void KillTimer(Handle timer, bool autoClose=false);![]()
sourcemod/core/TimerSys.cpp at master · alliedmodders/sourcemod
SourceMod - Source Engine Scripting and Administration - alliedmodders/sourcemodgithub.com
Всем привет!
Если кому не сложно,накидайте пожалуйста простенький плагин.
Чтоб при команде в чат,давало скорость на 2-3 секунды.
Заранее благодарю.
bool inSpeed[MAXPLAYERS+1];
public void OnClientPutInServer(int client)
{
inSpeed[client] = false;
}
public void OnClientDisconnect(int client)
{
inSpeed[client] = false;
}
public void OnPluginStart()
{
RegConsoleCmd("sm_speedme", speedme);
}
public Action speedme(int client, int args)
{
if(!inSpeed[client])
{
SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 5.0);
inSpeed[client] ^= true;
CreateTimer(2.0, ff, client);
}
return Plugin_Handled;
}
public Action ff(Handle hTimer, int client)
{
if(IsClientInGame(client))
{
SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 1.0);
inSpeed[client] ^= true;
}
return Plugin_Continue;
}
Куки представляют собой sqlite базу данных. Очистить данные конкретного клиента можно спокойно, если ты знаешь по каким условиям их чистить и какие куки по тому же принципу, как ты чистишь данные в бд, не совсем конечно так. Например зная steamid или ник, ты можешь изменить значение куков на невалидное для клиентаСпасибо большое
Сообщения автоматически склеены:
Всем привет, подскажите пожалуйста, как очистить игроку Cookies
Время если будет,добавь пожалуйста чтоб можно было использовать один раз за раунд.C++:bool inSpeed[MAXPLAYERS+1]; public void OnClientPutInServer(int client) { inSpeed[client] = false; } public void OnClientDisconnect(int client) { inSpeed[client] = false; } public void OnPluginStart() { RegConsoleCmd("sm_speedme", speedme); } public Action speedme(int client, int args) { if(!inSpeed[client]) { SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 5.0); inSpeed[client] ^= true; CreateTimer(2.0, ff, client); } return Plugin_Handled; } public Action ff(Handle hTimer, int client) { if(IsClientInGame(client)) { SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 1.0); inSpeed[client] ^= true; } return Plugin_Continue; }Сообщения автоматически склеены:
Куки представляют собой sqlite базу данных. Очистить данные конкретного клиента можно спокойно, если ты знаешь по каким условиям их чистить и какие куки по тому же принципу, как ты чистишь данные в бд, не совсем конечно так. Например зная steamid или ник, ты можешь изменить значение куков на невалидное для клиента
Время если будет,добавь пожалуйста чтоб можно было использовать один раз за раунд.
Что-то сразу не подумал написать.
Заранее благодарю!
А так все четко работает
bool inSpeed[MAXPLAYERS+1];
int iLimitSpeed[MAXPLAYERS+1];
public void OnClientPutInServer(int client)
{
inSpeed[client] = false;
}
public void OnClientDisconnect(int client)
{
inSpeed[client] = false;
}
public void OnPluginStart()
{
RegConsoleCmd("sm_speedme", speedme);
HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
}
public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && !IsFakeClient(i))
{
iLimitSpeed[i] = 1;
}
}
public Action speedme(int client, int args)
{
if(!inSpeed[client] && iLimitSpeed[client] > 0)
{
SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 5.0);
inSpeed[client] ^= true;
CreateTimer(2.0, ff, client);
iLimitSpeed[client]--;
return Plugin_Continue;
}
return Plugin_Handled;
}
public Action ff(Handle hTimer, int client)
{
if(IsClientInGame(client))
{
SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 1.0);
inSpeed[client] ^= true;
}
return Plugin_Continue;
}
}
Вроде все четкоПроверь, должно работатьКод:bool inSpeed[MAXPLAYERS+1]; int iLimitSpeed[MAXPLAYERS+1]; public void OnClientPutInServer(int client) { inSpeed[client] = false; } public void OnClientDisconnect(int client) { inSpeed[client] = false; } public void OnPluginStart() { RegConsoleCmd("sm_speedme", speedme); HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy); } public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast) { for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && !IsFakeClient(i)) { iLimitSpeed[i] = 1; } } public Action speedme(int client, int args) { if(!inSpeed[client] && iLimitSpeed[client] > 0) { SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 5.0); inSpeed[client] ^= true; CreateTimer(2.0, ff, client); iLimitSpeed[client]--; return Plugin_Continue; } return Plugin_Handled; } public Action ff(Handle hTimer, int client) { if(IsClientInGame(client)) { SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 1.0); inSpeed[client] ^= true; } return Plugin_Continue; } }
Ну и замечательно)Вроде все четко
нафига?inSpeed[client] ^= true;
нафига #2?int iLimitSpeed[MAXPLAYERS+1];
Можно без него?нафига?
нафига #2?