конец матча

GermanIvanov

Участник
Сообщения
40
Реакции
1
Хотелось бы получить следующий результат. Игроки доигрывают до конца матча. На экране висит табличка с результатом матча и висит она до тех пор, пока не кончится указанное в mp_timelimit время. Затем все игроки кикаются.

Говоря другими словами мне нужно равное время игры (mp_timelimit ) вне зависимости от длин раундов(которые бывают разные).

Настройки в конфиге
PHP:
mp_match_end_restart 1    
mp_match_end_changelevel 0
mp_endmatch_votenextmap 0

Написал такой код:

PHP:
public void OnPluginStart()
{
HookEvent("cs_win_panel_match", Event_MathEnd);
}

public void  Event_MathEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int timeleft;
    GetMapTimeLeft(timeleft);
    // sleep(timeleft);
    CreateTimer(timeleft+5.01, TimerExec, _, TIMER_FLAG_NO_MAPCHANGE);
}

public Action TimerExec(Handle timer)
{
   for(int client = 1; client < MaxClients; client++)
   if(!IsFakeClient(client))
   {
       KickClient(client,"");
   }
   return Plugin_Stop;
}

И все бы хорошо, но примерно через 10-15 секунд выскакивает менюшка выбора тима (контра или терроры) чтобы я не выбирал результат один - игра висит, и вскоре клиент благополучно прибивается таймером.

Попробовал вписать sleep(timeleft) - сервер покрашился :(
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
клиент благополучно прибивается таймером
Этим или игровым? В чём проблема то? Если выскакивает выбор команд ненужный - "прибивай" пораньше. Или всё равно таблица висит и должна ещё висеть? Оффтоп
 

GermanIvanov

Участник
Сообщения
40
Реакции
1
Этим.
Проблема в том, что не хочу менюшку выбора тима, хочу чтобы на экране продолжала висеть табличка результата.
Что то, непонятно что, запускает CHANGELEVEL:Looking for next level in mapgroup ''

вот все значащие имхо настройки.
C-подобный:
mp_timelimit 5                      // game time per map in minutes
mp_maxrounds 3                      // max number of rounds to play before server changes maps
mp_roundtime  1                   // How many minutes each round takes.
mp_roundtime_defuse 1            // How many minutes each round takes on defusal maps.
mp_win_panel_display_time 360        // The amount of time to show the win panel between matches / halfs
mp_warmuptime 0                // If true, there will be a warmup period/round at the start of each match to allow
mp_do_warmup_period 0            // Whether or not to do a warmup period at the start of a match.
mp_round_restart_delay 5        // Number of seconds to delay before restarting a round after a win
mp_join_grace_time 0            // Number of seconds after round start to allow a player to join a game
mp_match_can_clinch 0            // Can a team clinch and end the match by being so far ahead that the other team has no way to catching up
mp_force_pick_time 0            // The amount of time a player has on the team screen to make a selection before being auto-teamed
mp_freezetime 0                     // How many seconds to keep players frozen when the round starts
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Я вот думаю: раз тебе нужно только время:
То почему бы просто не обнулять все прочие квары (относящиеся к времени матча) в твоём событии? Тут, наверное, выбор команды и перестанет появляться.
 

GermanIvanov

Участник
Сообщения
40
Реакции
1
@AlmazON, В смысле кол-во раундов и их продолжительность? Можно попробовать но что то мне подсказывает что толку будет немного.
По хорошему мне как-то надо остаться в этой закончившейся игре, а не переходить в следующую.

То есть выяснил я тут
PHP:
GetMapTimeLeft(timeleft);
что у меня осталось 160 секунд, мне нужно 160 секунд что-то делать в игре, не давая ей закончится.
 

AlmazON

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

GermanIvanov

Участник
Сообщения
40
Реакции
1
Настройками я сначала хотел все решить. Сделать типа на 2-3 раунда больше чем надо, но выяснилось, что когда наступает время указанное в mp_timelimit игра не завершается, а продолжается до окончания текущего раунда. То есть при настройках
PHP:
mp_timelimit 5            // game time per map in minutes
mp_maxrounds 3        // max number of rounds to play before server changes maps
mp_roundtime  2
игра будет идти 6 минут а не 5.
Красивым решением наверно будет ужать(или растянуть) время последнего раунда так, чтобы точно уложиться в mp_timelimit. Сейчас попробую.

Попробовал. вроде все правильно делаю но не работает :( Что я делаю не так?
PHP:
public void OnPluginStart()
{
HookEvent("round_start", Event_RoundStart,EventHookMode_Pre);
}
public Action Event_RoundStart( Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
   int timeleft;
   GetMapTimeLeft(timeleft);
   int tl = hEvent.GetInt("timelimit");
   if(timeleft<tl)
   {
     LogMessage("[myuser]==================================  timeleft<timelimit set time=%d", timeleft);
     hEvent.SetInt("timelimit",timeleft);
     return Plugin_Changed;
   }
   return Plugin_Continue;

}
 
Последнее редактирование:

GermanIvanov

Участник
Сообщения
40
Реакции
1
сделал не понял вот лог
L 12/20/2016 - 22:41:50: [myuser.smx] [myuser]================================== timeleft 108 timelimit 60
L 12/20/2016 - 22:42:27: [myuser.smx] [myuser]================================== timeleft 71 timelimit 60
L 12/20/2016 - 22:43:19: [myuser.smx] [myuser]================================== timeleft 18 timelimit 60


все правильно у меня раунд длиться 1 минуту, ограниение на карту - 2 минуты.
на последний раунд остается всего 18 секунд (два раза по 5 секунд ушло на менюшки между раундами) но почему то оно не сработало :(
 

GermanIvanov

Участник
Сообщения
40
Реакции
1
Ага. спвсибо. А еще не хотела работать из round_start , согласилась из round_prestart
PHP:
public void OnPluginStart()
{
  HookEvent("round_prestart", Event_RoundStart, EventHookMode_Pre);
}

public Action Event_RoundStart( Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
  int i1;
   GetMapTimeLeft(i1);
  float timeleft = (i1*1.0) / 60.0;
  ConVar roundtimedef = FindConVar("mp_roundtime_defuse");
  if( timeleft < roundtimedef.FloatValue)
  {
  SetConVarFloat(roundtimedef,timeleft);
  SetConVarFloat(FindConVar("mp_roundtime"),timeleft);
  return Plugin_Changed;   
  }
  return Plugin_Continue;
}
 

AlmazON

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

GermanIvanov

Участник
Сообщения
40
Реакции
1
Думаю, тебе просто нужно было событие конца раунда.

Попробовал, не удается оттуда завершить раунд. Хотя стоп! Да и вообще, почему-то после того как заканчивается timelimit у меня идет еще один раунд(обрывающийя на полпути).
 

GermanIvanov

Участник
Сообщения
40
Реакции
1
пробовал завершается, и сразу переходит к следующему раунду невзирая на закончившийся timelimit
 

GermanIvanov

Участник
Сообщения
40
Реакции
1
да результат с минусом.

Попробовал перехватить round_start

PHP:
public Action Event_RoundStart( Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int i1;
    GetMapTimeLeft(i1);
    if(i1 < 0)
    {
        LogMessage("[myround] roundstart timeleft=%d", i1);
        CS_TerminateRound(1.0, CSRoundEnd_Draw,false);
    }
    return Plugin_Continue;
}
public void Event_RoundEnd( Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
  int i1;
  GetMapTimeLeft(i1);
  float timeleft = (i1*1.0) / 60.0;
  float roundtimedef;
  if(oldroundtimedef!=0)
  {
             roundtimedef=oldroundtimedef;
             SetConVarFloat(FindConVar("mp_roundtime_defuse"),roundtimedef);
             SetConVarFloat(FindConVar("mp_roundtime"),roundtimedef);
             oldroundtimedef=0.0;
  }
  if(timeleft < 0)
  {
      // CS_TerminateRound(1.0, CSRoundEnd_Draw,false);
      return;
  }
  roundtimedef=FindConVar("mp_roundtime_defuse").FloatValue;
  LogMessage("[round]  timeleft=%f,  roundtimedef=%f", timeleft, roundtimedef);
  if ( timeleft < roundtimedef)
  {
     oldroundtimedef = roundtimedef;
     LogMessage("[round] --- set round time = %f",timeleft);
     SetConVarFloat(FindConVar("mp_roundtime_defuse"),timeleft);
     SetConVarFloat(FindConVar("mp_roundtime"),timeleft);
  }
  return;
}

Два три раза моргает "round draw" затем матч заканчивается


C-подобный:
L 12/22/2016 - 12:53:44: [myround.smx] [round]  timeleft=1.750000,  roundtimedef=1.000000
L 12/22/2016 - 12:54:42: [myround.smx] [round]  timeleft=0.783333,  roundtimedef=1.000000
L 12/22/2016 - 12:54:42: [myround.smx] [round] --- set round time = 0.783333
L 12/22/2016 - 12:55:34: [myround.smx] [round]  timeleft=-0.066666,  roundtimedef=1.000000
L 12/22/2016 - 12:55:39: [myround.smx] [myround] roundstart timeleft=-9
L 12/22/2016 - 12:55:39: [myround.smx] [round]  timeleft=-0.150000,  roundtimedef=1.000000
L 12/22/2016 - 12:55:40: [myround.smx] [myround] roundstart timeleft=-10
L 12/22/2016 - 12:55:40: [myround.smx] [round]  timeleft=-0.166666,  roundtimedef=1.000000
L 12/22/2016 - 12:55:41: [myround.smx] [myround] roundstart timeleft=-11
L 12/22/2016 - 12:55:41: [myround.smx] [round]  timeleft=-0.183333,  roundtimedef=1.000000
L 12/22/2016 - 12:55:42: [myround.smx] [myround] roundstart timeleft=-12
L 12/22/2016 - 12:55:42: [myround.smx] [round]  timeleft=-0.200000,  roundtimedef=1.000000
L 12/22/2016 - 12:55:43: [myround.smx] [myround] roundstart timeleft=-13
L 12/22/2016 - 12:55:43: [myround.smx] [round]  timeleft=-0.216666,  roundtimedef=1.000000
L 12/22/2016 - 12:55:44: [myround.smx] [myround] roundstart timeleft=-14
L 12/22/2016 - 12:55:44: [myround.smx] [round]  timeleft=-0.233333,  roundtimedef=1.000000
L 12/22/2016 - 12:55:45: [myround.smx] [myround] roundstart timeleft=-15
L 12/22/2016 - 12:55:45: [myround.smx] [round]  timeleft=-0.250000,  roundtimedef=1.000000
L 12/22/2016 - 12:55:45: [myuser.smx] [myuser]====Event_MathEnd.
 
Последнее редактирование:
Сверху Снизу