Как блокировать CS-автокик для отдельных игроков?
|
|
slogic | Дата: Воскресенье, 07.01.2007, 23:06:29 | Сообщение # 1 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| В CS есть система автокика, если клиент не активен (не двигается). Можно ли как-то блокировать для отдельных игроков? Мне надо вообще-то для ботов (скрытых). Считаю нецелесообразным их двигать по таймеру. Хотелось бы блокировать это естественным образом.
|
|
| |
VEN | Дата: Понедельник, 08.01.2007, 00:03:29 | Сообщение # 2 |
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| Может "флажок" какой - копать надо... Крайний вариант - циклически менять origin, например, в prethink - тоже не так "страшно". Кстати, где хранится настройка максимального idle time (в Server Cvars не нашел подходящей по смыслу)?
Сообщение отредактировал VEN - Понедельник, 08.01.2007, 00:14:03 |
|
| |
slogic | Дата: Пятница, 12.01.2007, 18:13:50 | Сообщение # 3 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| В prethink менять глупо, лучше по таймеру, причем интервал установить минут 5, т.к. кикает через ~10 минут неактивности. Переменная mp_autokick влияет на такую функциональность сервера. Где хранится интервал - не нашел.
Сообщение отредактировал slogic - Пятница, 12.01.2007, 18:14:33 |
|
| |
VEN | Дата: Пятница, 12.01.2007, 19:35:47 | Сообщение # 4 |
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| Ну я сказал "крайний". :] Лучше, конечно, set_task, особенно если интервал большой.
|
|
| |
jeefo | Дата: Суббота, 13.01.2007, 17:45:08 | Сообщение # 5 |
Рядовой
Группа: Пользователи
Сообщений: 15
Статус: Не в сети
| Кикается через два раунда неактивности, можно только отключить, или изменить временем раунда 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...), так что телепортация не к чему
Сообщение отредактировал jeefo - Суббота, 13.01.2007, 17:52:55 |
|
| |
slogic | Дата: Суббота, 13.01.2007, 19:15:51 | Сообщение # 6 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| Дружище jeefo, это безусловно крутой ответ, но если бы ты поделился ссылочкой на исходники CSDLL, у нас у всех было бы намного меньше глупых вопросов. А?
|
|
| |
jeefo | Дата: Суббота, 13.01.2007, 19:29:51 | Сообщение # 7 |
Рядовой
Группа: Пользователи
Сообщений: 15
Статус: Не в сети
| Незаконно все это это исходники CS:Source, если по Googlу полазать можно найти Линков нет, грузить 40 метров куда либо, в лом (та самая ХЛ2+КСС 2003 года, украденная у Валв)
|
|
| |
VEN | Дата: Воскресенье, 14.01.2007, 13:56:51 | Сообщение # 8 |
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| Помню, помню. И ко мне такое добро попадало в свое время. Там даже переписки девелоперов были - интересно было почитать. :]
|
|
| |
slogic | Дата: Понедельник, 15.01.2007, 14:41:10 | Сообщение # 9 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| Блин, надо узнать смещение атрибута m_fLastMovement.
|
|
| |
VEN | Дата: Понедельник, 15.01.2007, 17:19:21 | Сообщение # 10 |
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| В общем вот: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
Статус: Не в сети
| Убрал пример 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
Статус: Не в сети
| В общем, 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) } |
|
|
| |