AMX MOD X
Суббота, 20.04.2024, 17:10:10



Приветствую Вас Гость | RSS
[ Главная ] [ Как блокировать CS-автокик для отдельных игроков? - AMX Mod X Форум ] [ Регистрация ] [ Вход ]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]

Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/

  • Страница 1 из 1
  • 1
Модератор форума: slogic, AlMod  
AMX Mod X Форум » Скриптинг » Помощь по скриптингу » Как блокировать CS-автокик для отдельных игроков?
Как блокировать CS-автокик для отдельных игроков?
slogicДата: Воскресенье, 07.01.2007, 23:06:29 | Сообщение # 1
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
В CS есть система автокика, если клиент не активен (не двигается). Можно ли как-то блокировать для отдельных игроков? Мне надо вообще-то для ботов (скрытых). Считаю нецелесообразным их двигать по таймеру. Хотелось бы блокировать это естественным образом.
 
VENДата: Понедельник, 08.01.2007, 00:03:29 | Сообщение # 2
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Репутация: 45
Статус: Не в сети
Может "флажок" какой - копать надо...
Крайний вариант - циклически менять origin, например, в prethink - тоже не так "страшно".
Кстати, где хранится настройка максимального idle time (в Server Cvars не нашел подходящей по смыслу)?


Сообщение отредактировал VEN - Понедельник, 08.01.2007, 00:14:03
 
slogicДата: Пятница, 12.01.2007, 18:13:50 | Сообщение # 3
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
В prethink менять глупо, лучше по таймеру, причем интервал установить минут 5, т.к. кикает через ~10 минут неактивности.

Переменная mp_autokick влияет на такую функциональность сервера.

Где хранится интервал - не нашел.

Сообщение отредактировал slogic - Пятница, 12.01.2007, 18:14:33
 
VENДата: Пятница, 12.01.2007, 19:35:47 | Сообщение # 4
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Репутация: 45
Статус: Не в сети
Ну я сказал "крайний". :] Лучше, конечно, set_task, особенно если интервал большой.
 
jeefoДата: Суббота, 13.01.2007, 17:45:08 | Сообщение # 5
Рядовой
Группа: Пользователи
Сообщений: 15
Репутация: 0
Статус: Не в сети
Кикается через два раунда неактивности, можно только отключить, или изменить временем раунда smile

csdll\player.cpp
Code

    if (    (m_flIdleCheckTime <= gpGlobals->time) || (m_flIdleCheckTime == 0.0)    )    
    {
     m_flIdleCheckTime = gpGlobals->time + 5;    // check every 5 seconds

     //check if this player has been inactive for 2 rounds straight
     if( (gpGlobals->time - m_fLastMovement) > ((CHalfLifeMultiplay*)g_pGameRules)->m_fMaxIdlePeriod )
     {
      if ( CVAR_GET_FLOAT( "mp_autokick" ) )
      {
       // Log the kick
       UTIL_LogPrintf("\"%s<%i><%s><%s>\" triggered \"Game_idle_kick\" (auto)\n",    
        STRING( pev->netname ),
        GETPLAYERUSERID( edict() ),
        GETPLAYERAUTHID( edict() ),
        GetTeam( m_iTeam ) );

       UTIL_ClientPrintAll( HUD_PRINTCONSOLE, "#Game_idle_kick", STRING(pev->netname) );
       SERVER_COMMAND(  UTIL_VarArgs( "kick %s\n", STRING( pev->netname ) )  );
       m_fLastMovement = gpGlobals->time;
      }
     }
    }

csdll\gamerules.cpp
Code

     // set the idlekick max time (in seconds)
     m_fMaxIdlePeriod = m_iRoundTime * 2;

m_fLastMovement обновляется с каждым нажатием любой кнопки (IN_DUCK, IN_ATTACK...), так что телепортация не к чему smile

Сообщение отредактировал jeefo - Суббота, 13.01.2007, 17:52:55
 
slogicДата: Суббота, 13.01.2007, 19:15:51 | Сообщение # 6
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
Дружище jeefo, это безусловно крутой ответ, но если бы ты поделился ссылочкой на исходники CSDLL, у нас у всех было бы намного меньше глупых вопросов. А?
 
jeefoДата: Суббота, 13.01.2007, 19:29:51 | Сообщение # 7
Рядовой
Группа: Пользователи
Сообщений: 15
Репутация: 0
Статус: Не в сети
Незаконно все это wink это исходники CS:Source, если по Googlу полазать можно найти smile Линков нет, грузить 40 метров куда либо, в лом sad (та самая ХЛ2+КСС 2003 года, украденная у Валв) smile
 
VENДата: Воскресенье, 14.01.2007, 13:56:51 | Сообщение # 8
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Репутация: 45
Статус: Не в сети
Помню, помню. И ко мне такое добро попадало в свое время. Там даже переписки девелоперов были - интересно было почитать. :]
 
slogicДата: Понедельник, 15.01.2007, 14:41:10 | Сообщение # 9
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
Блин, надо узнать смещение атрибута m_fLastMovement.
 
VENДата: Понедельник, 15.01.2007, 17:19:21 | Сообщение # 10
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Репутация: 45
Статус: Не в сети
В общем вот:
Code
#define OFFSET_USER_LASTACTIVITY_WIN32 124

// win32
stock Float:fm_cs_get_user_lastactivity(id) {
         return get_pdata_float(id, OFFSET_USER_LASTACTIVITY_WIN32)
}

// win32
stock fm_cs_set_user_lastactivity(id, Float:gametime) {
         set_pdata_float(id, OFFSET_USER_LASTACTIVITY_WIN32, gametime)
}



Сообщение отредактировал VEN - Понедельник, 15.01.2007, 19:26:20
 
VENДата: Понедельник, 15.01.2007, 19:31:30 | Сообщение # 11
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Репутация: 45
Статус: Не в сети
Убрал пример autokick immunity. Когда roundtime ставил например 0.04, кикало четко на первом new round'e - вот это и ввело в заблуждение. На самом деле - да, max. allowed idle time == roundtime*2.

EDIT: Эти функции "пойдут" в cstrike модуль: http://forums.alliedmods.net/showthread.php?t=49897

EDIT2:

Хотя, в принципе, мой autokick immunity метод должен работать для всех objective карт, когда за round end'ом следует new round. Ну может быть ему не "понравится" "химичиние" с mp_roundtime.

Сообщение отредактировал VEN - Понедельник, 15.01.2007, 22:43:54
 
VENДата: Вторник, 16.01.2007, 11:53:00 | Сообщение # 12
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Репутация: 45
Статус: Не в сети
В общем, mp_roundtime кэшируется игрой каждый новый раунд, поэтому изменений этой CVar мой метод "не боится". Улучшил его - должен работать для всех ojective карт без всяких set_task'ов.

Code
#include <amxmodx>
#include <fakemeta>

#define PLUGIN_NAME "Autockick Immunity"
#define PLUGIN_VERSION "TP2"
#define PLUGIN_AUTHOR "VEN"

#define NEWROUND_GAMECOMMENC_TIMEDIFF 3.02
#define RESTTASK_ROUNDREST_TIMEDIFF 1.0 // ~
#define NEWROUND_ROUNDEND_TIMEDIFF 5.02
#define SAFETY_TIMEADDITIVE 0.5

// client index of our immuned player
stock const id = 1

public plugin_init() {
         register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)

         // max. allowed idle time for a player == mp_roundtime*2
         // since mp_roundtime is cached by the game on new round
         // we do not care if someone will lower its value midround
         // this method will not work for maps without objectives

         register_logevent("logevent_round_end", 2, "1=Round_End")
         register_event("TextMsg", "event_game_commencing", "a", "2=#Game_Commencing")
         register_event("TextMsg", "event_restart_task", "a", "2=#Game_will_restart_in")
}

public event_game_commencing() {
         if (is_user_connected(id)) // if our immuned player is connected
                 fm_cs_set_user_lastactivity(id, get_gametime() + NEWROUND_GAMECOMMENC_TIMEDIFF + SAFETY_TIMEADDITIVE)
}

public event_restart_task() {
         static sztime[4]
         read_data(3, sztime, sizeof sztime - 1)
         if (is_user_connected(id)) // if our immuned player is connected
                 fm_cs_set_user_lastactivity(id, get_gametime() + str_to_float(sztime) + RESTTASK_ROUNDREST_TIMEDIFF + SAFETY_TIMEADDITIVE)
}

public logevent_round_end() {
         if (is_user_connected(id)) // if our immuned player is connected
                 fm_cs_set_user_lastactivity(id, get_gametime() + NEWROUND_ROUNDEND_TIMEDIFF + SAFETY_TIMEADDITIVE)
}

 
AMX Mod X Форум » Скриптинг » Помощь по скриптингу » Как блокировать CS-автокик для отдельных игроков?
  • Страница 1 из 1
  • 1
Поиск:

AMX Mod X Russian Community © 2006-2024