Заказать Сервер Заказать Плагин Контакты Поиск

[ вход ]
[ последние сообщения ]

Страница 1 из 3123»
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » Конец раунда (Принудительно, изменить причину, заблокировать)
Конец раунда
_wS_ Дата: Суббота, 11.02.2012, 14:28:46 | Сообщение # 1
Можно завершить раунд в любой момент, когда вам это нужно.

CS_TerminateRound(Float:delay, CSRoundEndReason:reason, bool:blockhook = false);

Цитата
delay - через сколько секунд начнется новый раунд
reason - причина окончания раунда
blockhook - если true, то событие (хук) CS_OnTerminateRound вызвано не будет


Причины конца раунда (reason):

Код
0 - бомба взорвана (CSRoundEnd_TargetBombed)
1 - VIP спасен (CSRoundEnd_VIPEscaped)
2 - VIP убит (CSRoundEnd_VIPKilled)
3 - террористы ускользнули (CSRoundEnd_TerroristsEscaped)
4 - CT не дали уйти большинству Террористов (CSRoundEnd_CTStoppedEscape)
5 - все террористы были нейтрализованы (CSRoundEnd_TerroristsStopped)
6 - бомба обезврежена (CSRoundEnd_BombDefused)
7 - Counter-Terrorists Win! (CSRoundEnd_CTWin)
8 - Terrorists Win! (CSRoundEnd_TerroristWin)
9 - ничья (CSRoundEnd_Draw)
10 - все заложники спасены (CSRoundEnd_HostagesRescued)
11 - цель сохранена (CSRoundEnd_TargetSaved)
12 - заложников не спасли (CSRoundEnd_HostagesNotRescued)
13 - Террористы не спаслись (CSRoundEnd_TerroristsNotEscaped)
14 - VIP не убежал (CSRoundEnd_VIPNotEscaped)
15 - новая игра (CSRoundEnd_GameStart)


Тест:

Код
#pragma semicolon 1

#include <sourcemod>
#include <cstrike>

public OnPluginStart()
{
     HookEvent("player_say", Say);
}

public Say(Handle:event, const String:name[], bool:silent)
{
     decl String:text[5]; GetEventString(event, "text", text, 5);
     if (strcmp(text, "1") == 0) CS_TerminateRound(5.0, CSRoundEndReason:2, false);
}


Введите в чат 1 чтобы завершить раунд. Новый начнется через 5 секунд.
 
_wS_ Дата: Суббота, 11.02.2012, 14:48:20 | Сообщение # 2
Есть хук-функция CS_OnTerminateRound, которая вызывается перед окончанием раунда.
delay и reason те же самые.

Quote
return Plugin_Continue; - нормальное (обычное) завершение раунда
return Plugin_Changed; - некоторые параметры были изменены
return Plugin_Handled; - раунд не будет завершен (даже если все умрут, бомба взорвалась и тд)


Причина конца раунда всегда будет 'бомба взорвана' или 'цель уничтожена':

Code
#pragma semicolon 1    

#include <sourcemod>    
#include <cstrike>

public Action:CS_OnTerminateRound(&Float:delay, &CSRoundEndReason:reason)
{
     reason = CSRoundEndReason:0;
     return Plugin_Changed;
}


Если вы блокируете конец раунда (Plugin_Handled), то желательно чтобы серверная переменная mp_ignore_round_win_conditions была равна 1. Просто впишите в ваш server.cfg или в самом скрипте измените. Если не сделаете это, то можете столкнуться с багом: Постоянно растет счет команд, добавляет +300 или больше побед в секунду.
 
Kudemus Дата: Четверг, 02.05.2013, 10:44:38 | Сообщение # 3
Сообщений: 4
Репутация: 0 [ +/- ]
Как сделать конец раунда по истечению mp_timelimit?
 
Darkeneez Дата: Четверг, 02.05.2013, 14:04:47 | Сообщение # 4
Сообщений: 222
Репутация: 18 [ +/- ]
запустить таймер равный mp_timelimit, после того как пройдет время завершить раунд.
 
Denis004 Дата: Четверг, 02.05.2013, 14:58:57 | Сообщение # 5
Сообщений: 15
Репутация: 0 [ +/- ]
Darkeneez, зачем так усложнять?!
Kudemus, пробуй
Код

#include <cstrike>

public OnPluginStart()
{
  HookEvent("player_death", Death);
}

public Death(Handle:event, const String:name[], bool:dontBroadcast)
{
  new timeleft;
  if (GetMapTimeLeft(timeleft))
  {
   if (timeleft < 1)
   {
    CS_TerminateRound(2.0, CSRoundEndReason:0)
   }
  }
}
 
Darkeneez Дата: Четверг, 02.05.2013, 15:19:12 | Сообщение # 6
Сообщений: 222
Репутация: 18 [ +/- ]
Если стоят 2 афк мы так и не сможем завершить раунд если истек mp_timelimit.
 
Kudemus Дата: Четверг, 02.05.2013, 16:25:15 | Сообщение # 7
Сообщений: 4
Репутация: 0 [ +/- ]
Цитата (Denis004)
Kudemus, пробуй

Не работает
 
Denis004 Дата: Четверг, 02.05.2013, 16:33:43 | Сообщение # 8
Сообщений: 15
Репутация: 0 [ +/- ]
Kudemus
Я проверил прежде выкладывать. У меня работал
 
TEIN Дата: Четверг, 02.05.2013, 16:55:21 | Сообщение # 9
Сообщений: 551
Репутация: 73 [ +/- ]
При старте карты (OnMapStart) запустите повторяющийся таймер (CreateTimer), при каждом выполнении таймера получайте время до конца карты (GetmapTimeLeft), сравниваем время и завершаем раунд (CS_TerminateRound)
 
Darkeneez Дата: Четверг, 02.05.2013, 17:13:27 | Сообщение # 10
Сообщений: 222
Репутация: 18 [ +/- ]
#include <sourcemod>
#include <cstrike>

new timeleft;

public OnMapStart()
{

CreateTimer(0.1, stopround, _, TIMER_REPEAT);
}

public Action:stopround(Handle:timer)
{
if (GetMapTimeLeft(timeleft))
{
if (timeleft < 1)
{
CS_TerminateRound(2.0, CSRoundEndReason:3);
KillTimer(timer);
}
}
}
 
TEIN Дата: Четверг, 02.05.2013, 17:15:12 | Сообщение # 11
Сообщений: 551
Репутация: 73 [ +/- ]
Исправил

Прикрепления: TerminateRound.sp(0Kb)


Сообщение отредактировал DoK_1997 - Пятница, 03.05.2013, 10:55:38
 
Darkeneez Дата: Четверг, 27.06.2013, 16:31:01 | Сообщение # 12
Сообщений: 222
Репутация: 18 [ +/- ]
public Action:CS_OnTerminateRound(&Float:delay, &CSRoundEndReason:reason)
{
if (reason == 7)
{
return Plugin_Handled;
}
return Plugin_Continue;
}

Ошибка 213 ( несоответсвие тегов). Но что за переменная тогда reason если не цифра?
 
TEIN Дата: Четверг, 27.06.2013, 17:16:38 | Сообщение # 13
Сообщений: 551
Репутация: 73 [ +/- ]
test

Прикрепления: 2094057.sp(0Kb)
 
_wS_ Дата: Четверг, 27.06.2013, 17:56:27 | Сообщение # 14
Darkeneez:

Код
if (reason == CSRoundEndReason:7) или if (reason == CSRoundEnd_CTWin)
 
WOW_NAMES Дата: Пятница, 30.01.2015, 12:58:37 | Сообщение # 15
Сообщений: 167
Репутация: -3 [ +/- ]
Подскажите почему завершая раунд предложенным кодом в любом варианте, он завершается но счет остается по нолям?
В CSGO пытаюсь сделать.
 
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » Конец раунда (Принудительно, изменить причину, заблокировать)
Страница 1 из 3123»
Поиск: