[CS:GO] Вопросы по работе с раундами

Svyatoy

Участник
Сообщения
335
Реакции
137
Привет! Возникла потребность решить данные задачи, ответов найти не удалось, поэтому обращаюсь к вам за помощью

Первое:
Допустим у меня время раунда 10 минут, но в определённый момент, например на 8:30 я активирую команду и мне нужно, чтобы до конца раунда осталось 5 минут, не перезапуская его.
Такое возможно? Если да - то как?
Команда чисто для понимания. Мне нужен кусок кода изменяющий время раунда

Второе:
В зависимости от определённых данных в конце раунда мне нужно изменить победителя. Не важно кто победил по-умолчанию.
Например:
Умерли КТ - По умол. побеждают Т но мне нужно, чтобы победили КТ из-за N события в плагине.
Как можно в конце раунда изменить победителя, чтобы счёт прибавился нужной команде и показало правильный оверлей стандартный?
 

Young <

Now, finally free
Сообщения
1,263
Реакции
505
Привет! Возникла потребность решить данные задачи, ответов найти не удалось, поэтому обращаюсь к вам за помощью

Второе:
В зависимости от определённых данных в конце раунда мне нужно изменить победителя. Не важно кто победил по-умолчанию.
Например:
Умерли КТ - По умол. побеждают Т но мне нужно, чтобы победили КТ из-за N события в плагине.
Как можно в конце раунда изменить победителя, чтобы счёт прибавился нужной команде и показало правильный оверлей стандартный?
Если я тебя правильно понял, то чтобы раунд завершился принудительно, можно вставить в плагин код из этой темы: Конец раунда - Форум . На счёт изменения времени раунда не уверен, но, по-моему, без перезапуска там никак.
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
Второе:
В зависимости от определённых данных в конце раунда мне нужно изменить победителя. Не важно кто победил по-умолчанию.
Например:
Умерли КТ - По умол. побеждают Т но мне нужно, чтобы победили КТ из-за N события в плагине.
Как можно в конце раунда изменить победителя, чтобы счёт прибавился нужной команде и показало правильный оверлей стандартный?
Лично таким не занимался, но идеи такие:

1. Вариант 1. Отлавливать round_end, менять победителя и причину. Ну и счет команд скорей всего через CS_SetTeamScore придется править.

2. Вариант 2. Ставить квар mp_ignore_round_win_conditions на 1 и самому все победы и поражения запускать через CS_TerminateRound.
 

Svyatoy

Участник
Сообщения
335
Реакции
137
Если я тебя правильно понял, то чтобы раунд завершился принудительно, можно вставить в плагин код из этой темы: Конец раунда - Форум . На счёт изменения времени раунда не уверен, но, по-моему, без перезапуска там никак.
Не совсем, когда заканчивается время раунда (у меня round_end / EventHookMode_Pre) мне нужно проверить некие данные и отправить игре нужного победителя

Я пробовал CS_TerminateRound(0.0, CSRoundEnd_CTWin), не проканало
Сообщения автоматически склеены:

Лично таким не занимался, но идеи такие:

1. Вариант 1. Отлавливать round_end, менять победителя и причину. Ну и счет команд скорей всего через CS_SetTeamScore придется править.

2. Вариант 2. Ставить квар mp_ignore_round_win_conditions на 1 и самому все победы и поражения запускать через CS_TerminateRound.
Первый вариант интереснее, а как там изменить правильно победителя? Я пробовал, звук вроде меняется, а вот оверлей и счёт нет
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,982
Svyatoy, а почему время - 0 секунд?
М/б стоило бы увеличить хотя бы до 3 (дефолтом в игре, емнип, вообще 5 идёт).
 

Svyatoy

Участник
Сообщения
335
Реакции
137
Svyatoy, а почему время - 0 секунд?
М/б стоило бы увеличить хотя бы до 3 (дефолтом в игре, емнип, вообще 5 идёт).
Я пробовал разное, в том числе и 7.0
Сообщения автоматически склеены:

Самое интересное, что этот код убирает полностью звук, но остаётся само событие победы, оверлей и прибавляется счётчик, не смотря ни на что
Sourcepawn:
HookEvent("round_end", OnRoundEnd, EventHookMode_Pre);

stock Action OnRoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    CS_TerminateRound(7.0, CSRoundEnd_CTWin);    // 7.0 - Значение mp_round_restart_delay

    return Plugin_Stop;
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,982
Я пробовал, звук вроде меняется, а вот оверлей и счёт нет
Кстати, а код можно глянуть?
Может что-то не было учтено при изменении.
Я пробовал разное, в том числе и 7.0
Вообще никакой реакции?
Тоже хотелось бы взглянуть на эту часть кода. По той же самой причине.
 

Svyatoy

Участник
Сообщения
335
Реакции
137
Кстати, а код можно глянуть?
Может что-то не было учтено при изменении.Вообще никакой реакции?
Тоже хотелось бы взглянуть на эту часть кода. По той же самой причине.
Код выше о котором ты говоришь по второй части, а по поводу первой, вот (Пример для постоянной победы КТ. Данные взял из GetInt до этого)


Sourcepawn:
stock Action OnRoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    hEvent.SetInt("winner", 3);
    hEvent.SetInt("reason", 8);

    return Plugin_Changed;
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,982
Данные взял из GetInt до этого)
Можно было взять и из cstrike.inc:
C-подобный:
enum CSRoundEndReason
{
    CSRoundEnd_TargetBombed = 0,           /**< Target Successfully Bombed! */
    CSRoundEnd_VIPEscaped,                 /**< The VIP has escaped! - Doesn't exist on CS:GO */
    CSRoundEnd_VIPKilled,                  /**< VIP has been assassinated! - Doesn't exist on CS:GO */
    CSRoundEnd_TerroristsEscaped,          /**< The terrorists have escaped! */
    CSRoundEnd_CTStoppedEscape,            /**< The CTs have prevented most of the terrorists from escaping! */
    CSRoundEnd_TerroristsStopped,          /**< Escaping terrorists have all been neutralized! */
    CSRoundEnd_BombDefused,                /**< The bomb has been defused! */
    CSRoundEnd_CTWin,                      /**< Counter-Terrorists Win! */
    CSRoundEnd_TerroristWin,               /**< Terrorists Win! */
    CSRoundEnd_Draw,                       /**< Round Draw! */
    CSRoundEnd_HostagesRescued,            /**< All Hostages have been rescued! */
    CSRoundEnd_TargetSaved,                /**< Target has been saved! */
    CSRoundEnd_HostagesNotRescued,         /**< Hostages have not been rescued! */
    CSRoundEnd_TerroristsNotEscaped,       /**< Terrorists have not escaped! */
    CSRoundEnd_VIPNotEscaped,              /**< VIP has not escaped! - Doesn't exist on CS:GO */
    CSRoundEnd_GameStart,                  /**< Game Commencing! */
  
    // The below only exist on CS:GO
    CSRoundEnd_TerroristsSurrender,        /**< Terrorists Surrender */
    CSRoundEnd_CTSurrender,                /**< CTs Surrender */
    CSRoundEnd_TerroristsPlanted,          /**< Terrorists Planted the bomb */
    CSRoundEnd_CTsReachedHostage           /**< CTs Reached the hostage */
};
CSRoundEnd_TerroristWin - это как раз CSRoundEndReason 8. Т.е. у тебя причина окончания - победили террористы, а победившая команда - спецы. 😁
Ну и при использовании этого инклюда можно индекс команды писать в виде CS_TEAM_*

CS_TerminateRound()
, кмк, нельзя использовать совместно с хуком HookEvent("round_end", Event_*, EventHookMode_Pre);
Ну или нужно ставить 3-му параметру значение true, чтобы завершение не хукалось.
 
Последнее редактирование:

Svyatoy

Участник
Сообщения
335
Реакции
137
Можно было взять и из cstrike.inc:
C-подобный:
enum CSRoundEndReason
{
    CSRoundEnd_TargetBombed = 0,           /**< Target Successfully Bombed! */
    CSRoundEnd_VIPEscaped,                 /**< The VIP has escaped! - Doesn't exist on CS:GO */
    CSRoundEnd_VIPKilled,                  /**< VIP has been assassinated! - Doesn't exist on CS:GO */
    CSRoundEnd_TerroristsEscaped,          /**< The terrorists have escaped! */
    CSRoundEnd_CTStoppedEscape,            /**< The CTs have prevented most of the terrorists from escaping! */
    CSRoundEnd_TerroristsStopped,          /**< Escaping terrorists have all been neutralized! */
    CSRoundEnd_BombDefused,                /**< The bomb has been defused! */
    CSRoundEnd_CTWin,                      /**< Counter-Terrorists Win! */
    CSRoundEnd_TerroristWin,               /**< Terrorists Win! */
    CSRoundEnd_Draw,                       /**< Round Draw! */
    CSRoundEnd_HostagesRescued,            /**< All Hostages have been rescued! */
    CSRoundEnd_TargetSaved,                /**< Target has been saved! */
    CSRoundEnd_HostagesNotRescued,         /**< Hostages have not been rescued! */
    CSRoundEnd_TerroristsNotEscaped,       /**< Terrorists have not escaped! */
    CSRoundEnd_VIPNotEscaped,              /**< VIP has not escaped! - Doesn't exist on CS:GO */
    CSRoundEnd_GameStart,                  /**< Game Commencing! */
 
    // The below only exist on CS:GO
    CSRoundEnd_TerroristsSurrender,        /**< Terrorists Surrender */
    CSRoundEnd_CTSurrender,                /**< CTs Surrender */
    CSRoundEnd_TerroristsPlanted,          /**< Terrorists Planted the bomb */
    CSRoundEnd_CTsReachedHostage           /**< CTs Reached the hostage */
};
CSRoundEnd_TerroristWin - это как раз CSRoundEndReason 8. Т.е. у тебя причина окончания - победили террористы, а победившая команда - спецы. 😁
Ну и при использовании этого инклюда можно индекс команды писать в виде CS_TEAM_*

CS_TerminateRound()
, кмк, нельзя использовать совместно с хуком HookEvent("round_end", Event_*, EventHookMode_Pre);
Ну или нужно ставить 3-му параметру значение true, чтобы завершение не хукалось.
Но в случае смерти всех Т GetInt как раз возвращает 3 и 8
А в случе смери КТ 2 и 9
Хмм

А выставление true не могло повлиять с, собственно не повлияло, но натолкнуло на мысль!
Можно выставить постоянную победу КТ. Это меняет звук и оверлей, но счёт придётся править вручную через CS_SetTeamScore

Sourcepawn:
public Action CS_OnTerminateRound(float& delay, CSRoundEndReason& reason)
{
    reason = CSRoundEnd_CTWin;

    return Plugin_Changed;
}

Вторую задачу считаю решённой, спасибо! Нужно решить первую :)

Возможно подойдёт вариант как-то визуально изменить время, если возможно. А закончить раунд могу уже сам по таймеру

Сообщения автоматически склеены:

UP, первая задача ещё актуальна
 
Последнее редактирование:

Svyatoy

Участник
Сообщения
335
Реакции
137
Допустим у меня время раунда 10 минут, но в определённый момент, например на 8:30 я активирую команду и мне нужно, чтобы до конца раунда осталось 5 минут, не перезапуская его.
Такое возможно? Если да - то как?
Команда чисто для понимания. Мне нужен кусок кода изменяющий время раунда

Нашел решение в JWP - спасибо разработчику!

GameRules_SetProp("m_iRoundTime", 16, 4, 0, true); - изменит время до конца раунда на 16 секунд
GameRules_SetProp("m_iRoundTime", GameRules_GetProp("m_iRoundTime", 4, 0)+16, 4, 0, true); - увеличит текущее время до конца раунда на 16 секунд

Решил написать сюда, вдруг кто-то тоже будет искать
 
Сверху Снизу