[CS: Source] Kick Spectators

Тема в разделе "Новые плагины", создана пользователем SourceSamil, 11 май 2015.

  1. SourceSamil

    SourceSamil

    Сообщения:
    121
    Симпатии:
    24
    Kick Spectators

    Описание:
    Плагин кикает игроков, которые находятся в команде spectators или не находятся в какой-либо команде.

    ConVars:
    //Интервал проверки команды игрока.
    sm_checktime 15.0
    //Будут ли защищены игроки с иммунитетом.
    sm_immunenable 1
    //Кол-во иммунитета для защиты.
    sm_immunval 30

    Версии:
    1.0 - Релиз.
    1.1 - Работа по циклу.
     

    Вложения:

    Последнее редактирование: 11 май 2015
    Danyas нравится это.
  2. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.714
    Симпатии:
    451
    approved.

    ТС, вы не хотите сделать всё через один таймер?

    kick_spec.sp(44) : error 100: function prototypes do not match
     
  3. SourceSamil

    SourceSamil

    Сообщения:
    121
    Симпатии:
    24
    Хм, я не знаю, что больше грузит сервер цикл или куча таймеров, подскажи

    Добавлено через 1 минуту
    Эм, у меня нету ошибок
     
    Последнее редактирование: 11 май 2015
  4. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.714
    Симпатии:
    451
    Скорее куча таймеров будет больше кушать чем один цикл.

    Проблема в старом компиляторе, укажите в теме об этом
     
  5. SourceSamil

    SourceSamil

    Сообщения:
    121
    Симпатии:
    24
    Проверь на ошибки, т.к. компилирую у себя sourcemod-ом 1.8

    Добавлено через 3 минуты
    UPD 1.1
    Теперь компилируется.
     
    Последнее редактирование: 11 май 2015
  6. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.960
    n-ое количество таймеров имеет смысл, когда определённая задержка требуется для каждого игрока. Если же проверяются все подряд и точность не нужна - одним таймеров с циклом по всем игрокам.
     
    TWRP нравится это.
  7. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    893
    Симпатии:
    659
    Немного странный способ, можно сделать через событие player_team, ну и при заходе проверить (+ ко всему: создается куча повторяющихся таймеров)

    Оффтоп
     
    Последнее редактирование: 11 май 2015
  8. SourceSamil

    SourceSamil

    Сообщения:
    121
    Симпатии:
    24
    Эм, для чего тут тестирование, плагин на 10 строк, таймер теперь 1....
     
  9. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    893
    Симпатии:
    659
    SourceSamil
    PHP:
    // Таймер один? ок..
    public OnClientPostAdminChecki_Client )
    {
        
    CreateTimerg_f_Cvar_CheckTimeTimer_CheckTeams_TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE );
    }
     
    Danyas нравится это.
  10. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.960
    Конечно куча. Остановки вообще никакой! Завис сервера со временем обеспечен, если карта на сервере не менялась продолжительное время.
     
  11. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.714
    Симпатии:
    451
    Если обнаружатся проблемы - перенесу в новые плагины.
    Если их автор не будет фиксить - перенесу в отклоненные.
     
  12. SourceSamil

    SourceSamil

    Сообщения:
    121
    Симпатии:
    24
    Фак....

    Добавлено через 2 минуты
    Простите ребятушки, исправил

    Добавлено через 3 минуты
    Ромео, я на новом синтаксисе чаще работаю, чем на старом
     
    Последнее редактирование: 11 май 2015
  13. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    235
    Симпатии:
    568
    Код:
    for( new i_Client = 1; i_Client <= MaxClients; i_Client++ )
    {
    	if( i_Client > 0 && IsClientInGame( i_Client ) )
    В цикле от 1 до MaxClients мы проверяем на то, что число будет > 0.

    Код:
    if( i_Team != 2 && i_Team != 3 )
    Плагин в разделе CS: Source, но проверка идет на != 2 и != 3. Согласно cstrike.inc:
    Код:
    #define CS_TEAM_NONE		0	/**< No team yet. */
    #define CS_TEAM_SPECTATOR	1	/**< Spectators. */
    #define CS_TEAM_T 		2	/**< Terrorists. */
    #define CS_TEAM_CT		3	/**< Counter-Terrorists. */
    Куда разумнее будет проверять на == 1. UPD. Хотя нет. Те, кто только подключились, имеют 0\1 команду, т.к. они выбирают. И они прекрасно могут быть кикнуты как "спектраторы". Данный плагин "одобрять" на данный момент нельзя, в его алгоритме работы серьезная ошибка.

    Код:
    if( g_b_Cvar_Immunity_Enable )
    {
    	new AdminId: i_ClientAdminId = GetUserAdmin( i_Client );
    	if( i_ClientAdminId == INVALID_ADMIN_ID )
    	{
    		KickClient( i_Client, "%t", "KickReason" );
    	}
    	else
    	{
    		new i_Immunity = GetAdminImmunityLevel( i_ClientAdminId );
    		if( i_Immunity < g_i_Cvar_Immunity_Value )
    		{
    			KickClient( i_Client, "%t", "KickReason" );
    		}
    	}
    }
    else KickClient( i_Client, "%t", "KickReason" );
    Очень много повторений. Можно написать проще:
    Код:
    if ( g_b_Cvar_Immunity_Enable )
    {
    	new AdminId: i_ClientAdminId = GetUserAdmin( i_Client );
    	if ( i_ClientAdminId != INVALID_ADMIN_ID && GetAdminImmunityLevel( i_ClientAdminId ) >= g_i_Cvar_Immunity_Value )
    	{
    		continue;
    	}
    }
    KickClient( i_Client, "%t", "KickReason" );
    И да, делать такое через таймер неразумно. Согласен с The End Is Near..., гораздо проще отлавливать player_team.

    P.S.
    Нового синтаксиса тут нет. Плагин написан на синтаксисе сурсмода от 1.0 версии до 1.7.
     
    R1KO нравится это.
  14. White Wolf

    White Wolf [] (int _n) -> double { return (_n % 2) == 0;}); Супер-модератор

    Сообщения:
    1.186
    Симпатии:
    411
    Разница совсем небольшая.
     
  15. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.960
    PHP:
    public OnConfigsExecuted(  )
    {
        
    g_f_Cvar_CheckTime GetConVarFloatg_h_Cvar_CheckTime );
        
    g_b_Cvar_Immunity_Enable GetConVarBoolg_h_Cvar_Immunity_Enable );
        
    g_i_Cvar_Immunity_Value GetConVarIntg_h_Cvar_Immunity_Value);
    }

    public 
    OnMapStart(  )
    {
        
    CreateTimerg_f_Cvar_CheckTimeTimer_CheckTeams_TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE );
    }
    Сначала запускаем таймер, а уже после обновляем состояние переменных, причём одна из которых - относится именно к этому таймеру?!
    И почему бы вообще не сделать всё в одном вызове, причём выкинув лишнюю переменную:
    PHP:
    public OnConfigsExecuted(  )
    {
        
    CreateTimerGetConVarFloatg_h_Cvar_CheckTime ), Timer_CheckTeams_TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE );
        
    g_b_Cvar_Immunity_Enable GetConVarBoolg_h_Cvar_Immunity_Enable );
        
    g_i_Cvar_Immunity_Value GetConVarIntg_h_Cvar_Immunity_Value);
    }