[CS: Source] Mapchooser RoundEndVote

TolikCorp

Участник
Сообщения
874
Реакции
334
Состряпал небольшой плагин для запуска голосования за карту не во время игры, а в конце раунда.
Необходимое условие, чтобы было выставлено значение:
sm_mapvote_start "3.0" или меньше
Ver. 3.0
PHP:
public OnConfigsExecuted() HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
public Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
    new mapTimeLeft;
    if(GetMapTimeLeft(mapTimeLeft) && mapTimeLeft < 600)
    {
        UnhookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
        ServerCommand("sm_mapvote");
    }
}
Ver. 2.0
PHP:
new bool:doCheck = true;
public OnPluginStart() HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
public OnConfigsExecuted() doCheck = true;
public Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
    if(doCheck)
    {
        new mapTimeLeft;
        GetMapTimeLeft(mapTimeLeft)
        if(0 < mapTimeLeft <= 600)
        {
            doCheck = false;
            ServerCommand("sm_mapvote");
        }
    }
}

Ver. 1.0
PHP:
new bool:doRunVote = false;
new bool:doCheck = true;
public OnPluginStart()
    HookEvent("round_end", Event_RoundEnd);
public OnMapStart(){
    doRunVote = false;
    doCheck = true;
}
public Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast){
    if(doCheck){
        new mapTime;
        GetMapTimeLimit(mapTime);
        mapTime=mapTime*60;
        new mapTimeLeft;
        GetMapTimeLeft(mapTimeLeft);
        if(mapTimeLeft <= mapTime/3){
            doRunVote = true;
            doCheck = false;
        }
    }
    if(doRunVote){
        doRunVote = false;
        doCheck = false;
        ServerCommand("sm_mapvote");
    }
}
 
Последнее редактирование:

Arthur Don

Участник
Сообщения
1,697
Реакции
256
TolikCorp,
 

Вложения

  • Mapchooser_RoundEndVote.sp
    683 байт · Просмотры: 47
  • Mapchooser_RoundEndVote.smx
    2.8 КБ · Просмотры: 40

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,756
TolikCorp, попробуй проще:
PHP:
new bool:doCheck;

public OnPluginStart() HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);

public OnConfigsExecuted() doCheck = true;

public Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
	if(doCheck)
	{
		new mapTimeLeft, mapTime;
		if(GetMapTimeLeft(mapTimeLeft) && GetMapTimeLimit(mapTime) && mapTimeLeft <= mapTime*60/3)
		{
			doCheck = false;
			ServerCommand("sm_mapvote");
		}
	}
}
GetMapTimeLimit(mapTime) так то зачем вообще? Вместо этого поставить квар времени в секундах, чтобы после указанного оствшегося времени карты проводилось голосование.
 

TolikCorp

Участник
Сообщения
874
Реакции
334
Можно, но ты знаешь сколько у каждого стоит время карты? А тут когда остается треть времени.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,756
TolikCorp, максимум оптимизации:
PHP:
public OnConfigsExecuted() HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
public Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
	new mapTimeLeft;
	if(GetMapTimeLeft(mapTimeLeft) && mapTimeLeft < 600)
	{
		UnhookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
		ServerCommand("sm_mapvote");
	}
}
 

TolikCorp

Участник
Сообщения
874
Реакции
334
Все же надо делать:
0 < mapTimeLeft <= 600
т.к. карта может быть бесконечной, а тут вдруг изменили timelimit и появился timeleft

Добавлено через 27 минут
хмм, смотри: а если карта сменится до этого события, допустим, админом, а тут -
public OnConfigsExecuted() HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
?
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,756
карта может быть бесконечной
Так бесконечность, а не 0. Смысл тогда? Проверял, 0 вместо неё?
На секунду разница, ничего не убудет, зато -1 байт.
если карта сменится до этого события, допустим, админом, а тут -
public OnConfigsExecuted() HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
Как? С админки вообще не реально, всё уже давно загрузится в этот момент, да и не хукнется, что с того? Нам ещё лучше! Карта же всё равно меняется, так смысл всех действий на секундной карте?
Даже, если выйдет какая-то ошибка в логах по этому поводу, всё равно, надо это событие убрать (не создавая лишних проверок до истечения 600 секунд в раундах).
 
Последнее редактирование:

TolikCorp

Участник
Сообщения
874
Реакции
334
Кажется, я неправильно объяснил.
Играем, хукаем событие. До срабатывания unhook еще далеко. А тут решил админ сменить карту, событие еще хукается, да еще раз запускатся HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
что-то накладка получается
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,756
что-то накладка получается
Ты проверял? После окончания карты SM сам делает все Unhook'и и CloseHandle, кроме остановки таймеров (без нужного флага).
Нет смысла ещё проверок наставлять - это большая накладка.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,756

TolikCorp

Участник
Сообщения
874
Реакции
334
То, что работать будет - я не сомневаюсь, тут даже проверять не надо - и так видно. Не знал некоторых особенностей, и из-за них засомневался.
 
Сообщения
1
Реакции
0
banner_4580.jpg
 
Сверху Снизу