Открыть меню при нажатии кнопки на клавиатуре.

pokypka20

Участник
Сообщения
244
Реакции
31
Подскажите как можно открыть игроку меню, или выполнять команду при нажатии кнопки на клавиатуре? тоесть: чтобы открыть меню сервера нажмите F2 допустим.
 

pokypka20

Участник
Сообщения
244
Реакции
31
Я смотрел полностью всю тему сриптинг и брал всё что мне казалось интерестным, а то чего я не нашол спрашиваю.
 

Sokret

Участник
Сообщения
33
Реакции
4
вот
public OnPluginStart()
{
RegConsoleCmd("rebuy", test);
}

public Action:test(client, args)
{
FakeClientCommand(client, "say ку")
}
 

pokypka20

Участник
Сообщения
244
Реакции
31
Подскажите в чём проблема?

PHP:
#include <sourcemod>
new Handle:FastProm[MAXPLAYERS+1];
public OnPluginStart() HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);

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

public Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
	new client=GetClientOfUserId(GetEventInt(event, "userid"));
	FakeClientCommand(client, "say wcs_play");
	FastProm[client] = CreateTimer(60.0, FastProm_Open, client);
}

public Action:FastProm_Open(Handle:timer, any:client) 
{ 
    FakeClientCommand(client, "say wcs_stop");
    FastProm[client] = INVALID_HANDLE; 
}

Мне кажется ошибка с таймером, но всё же ничего не работает))
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
public Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast){    new client=GetClientOfUserId(GetEventInt(event, "userid"));
В событии начала раунда нельзя получить клиента. Используй цикл.
CreateTimer(60.0, FastProm_Open, client);
Здесь так делать плохо. Ставь циклом после таймера.
 

pokypka20

Участник
Сообщения
244
Реакции
31
Здесь так делать плохо. Ставь циклом после таймера.

с первым я разобрался, а что значит это?

PHP:
#include <sourcemod>
new Handle:FastProm[MAXPLAYERS+1];
public OnPluginStart() HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);

public OnClientDisconnect(i) 
 { 
     if (FastProm[i] != INVALID_HANDLE) 
     { 
         KillTimer(FastProm[i]); 
         FastProm[i] = INVALID_HANDLE; 
     } 
 }

public Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
	for(new i=1; i <= MaxClients; i++)
    {
	FakeClientCommand(i, "say wcs_play");
	FastProm[i] = CreateTimer(60.0, FastProm_Open, i);
	}
}

public Action:FastProm_Open(Handle:timer, any:i) 
{
    FakeClientCommand(i, "say wcs_stop");
    FastProm[i] = INVALID_HANDLE; 
}
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Зачем получать клиента заранее, если действие для него выполнятся через минуту? За это время он может выйти. И вообще, создавать таймер для каждого (по факту), когда действие всегда выполняется у всех одновременно и в начале, и в конце?
for(new i=1; i <= MaxClients; i++)
    {
    FakeClientCommand(i, "say wcs_play");
Дальше таймер отдельный от i. Лучше ещё раз циклом. А вообще, если игрок зайдёт чуть позже начала раунда, то игра его отспавнит, а твоя команда не сработает. Получается баг.
В итоге, начинай команду от спавна.
 
Последнее редактирование:

pokypka20

Участник
Сообщения
244
Реакции
31
Зачем получать клиента заранее, если действие для него выполнятся через минуту? За это время он может выйти. И вообще, создавать таймер для каждого (по факту), когда действие всегда выполняется у всех одновременно и в начале, и в конце?

Дальше таймер отдельный от i. Лучше ещё раз циклом. А вообще, если игрок зайдёт чуть позже начала раунда, то игра его отспавнит, а твоя команда не сработает. Получается баг.
В итоге, начинай команду от спавна.

Если игрок возродиться второй раз или зайдёт позже команда и не должна сработать, можеш подсказать как правильно сделать, мне немного не понятно в чем ошибка и где я получал клиента заранее, и как выполнить команду игроку чтобы сильно не нагружало сервер.

Смысл в начале раунда нужно включить команду, через минуту выключить. (минута это образно, задержка будет секунд 10.)
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
возродиться второй раз
Не обязательно второй. Только присоединился к серверу, а раунд начат. Если он зайдёт за команду, КТ например, через несколько секунд после этого, то его сама игра возродит, а твоя фишка не сработает. Тебе такое нужно?
А, если, как у тебя, то предлагаю так:
PHP:
new Handle:FastProm;

public OnPluginStart() HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);

public Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
	if (FastProm != INVALID_HANDLE) KillTimer(FastProm);
	else
	{
		for (new i = 1; i <= MaxClients; i++)
		{
			if (IsClientInGame(i)) FakeClientCommand(i, "say wcs_play");
		}
	}
	FastProm = CreateTimer(60.0, FastProm_Open);
}

public Action:FastProm_Open(Handle:timer)
{
	FastProm = INVALID_HANDLE;
	for (new i = 1; i <= MaxClients; i++)
	{
		if (IsClientInGame(i)) FakeClientCommand(i, "say wcs_stop");
	}  
}
Это стоит делать в случае, если wcs сам не отключается командой wcs_stop при смерти игрока, конце раунда и т.д.
PHP:
new Handle:FastProm;

public OnPluginStart() HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);

public Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
	if (FastProm != INVALID_HANDLE) KillTimer(FastProm);
	for (new i = 1; i <= MaxClients; i++)
	{
		if (IsClientInGame(i)) FakeClientCommand(i, "say wcs_play");
	}
	FastProm = CreateTimer(60.0, FastProm_Open);
}

public Action:FastProm_Open(Handle:timer)
{
	FastProm = INVALID_HANDLE;
	for (new i = 1; i <= MaxClients; i++)
	{
		if (IsClientInGame(i)) FakeClientCommand(i, "say wcs_stop");
	}  
}
 
Последнее редактирование:

pokypka20

Участник
Сообщения
244
Реакции
31
Вопрос, если у меня есть таймер:
PHP:
CreateTimer(5.0, Timer_Vote, victim);
PrintHintText(client, "Вы возродитесь через: %d", ???);

Как можно получить значение таймера чтобы вывести его вместо %d ?
Можно ли отлавливать сколько осталось на таймере? Тоесть не просто вывести 5 сек, а выводить каждую секунду до остановки таймера (обновлять).
 

pokypka20

Участник
Сообщения
244
Реакции
31
Насколько я знаю - никак. Если бы на это был натив, то этим давно пользовались и не создавали повторяющихся таймеров показа остатка времени.

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

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
показать пример
Не известно, чего ты хочешь конкретно сделать, относительно чего? Что выставляет значение времени? Другой плагин воскрешения или же ты сам воскрешаешь игра?
А так, начать таймер со смерти игрока (хукнуть событие).
 

pokypka20

Участник
Сообщения
244
Реакции
31
Это чисто пример как должно получиться, просто чтобы показать.

PHP:
new Handle:FastProm[MAXPLAYERS+1];

public OnPluginStart() 
{
	HookEvent("player_death", Event_PlayerDeath, EventHookMode_PostNoCopy); 
}

public Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast) 
{ 
    FastProm = CreateTimer(5.0, FastProm_Open); 
	PrintHintText(client, "Вы возродитесь через: %d", ???); 
} 

public Action:FastProm_Open(Handle:timer) 
{ 
    FastProm = INVALID_HANDLE; 
	CS_RespawnPlayer(client);
}
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
pokypka20, чисто пример и даю:
PHP:
new sec[MAXPLAYERS+1];

public OnPluginStart() 
{
    HookEvent("player_death", Event_PlayerDeath, EventHookMode_Post); 
}

public Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast) 
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	sec[client] = 5;
    CreateTimer(1.0, FastProm_Open, client, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
} 

public Action:FastProm_Open(Handle:timer, any:client) 
{
	if (--sec[client] > 0)
	{
		PrintHintText(client, "Вы возродитесь через: %d", sec[client]);
		return Plugin_Continue;
	}
	else if (client && IsClientInGame(client)) CS_RespawnPlayer(client);
	return Plugin_Stop;
}
 

pokypka20

Участник
Сообщения
244
Реакции
31
pokypka20, чисто пример и даю:
PHP:
new sec[MAXPLAYERS+1];

public OnPluginStart() 
{
    HookEvent("player_death", Event_PlayerDeath, EventHookMode_Post); 
}

public Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast) 
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	sec[client] = 5;
    CreateTimer(1.0, FastProm_Open, client, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
} 

public Action:FastProm_Open(Handle:timer, any:client) 
{
	if (--sec[client] > 0)
	{
		PrintHintText(client, "Вы возродитесь через: %d", sec[client]);
		return Plugin_Continue;
	}
	else if (client && IsClientInGame(client)) CS_RespawnPlayer(client);
	return Plugin_Stop;
}
Спс, то что нужно.
 

Похожие темы

Ответы
1
Просмотры
537
Ответы
2
Просмотры
414
Ответы
2
Просмотры
381
  • Закрыта
Неактуально Bot path fix
Ответы
1
Просмотры
Сверху Снизу