Русское сообщество по скриптингу

Ошибка при отправке команды в консоль клиента

Все вопросы по скриптингу для Metamod, помощь в редактировании плагинов.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для
Metamod.


Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [pawn], в противном случае, если тег [pawn] не отображает ваш код, можно использовать тег [code].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник плагина.

Ошибка при отправке команды в консоль клиента

Сообщение Dekart » 14 май 2012, 08:39

Добрый день!

При заходе игрока на сервер, я пытаюсь сразу закинуть его в нужную команду, так чтобы он не мог выбрать сторону и класс.

Процедура ClientPutInServer имеет такой вид:
Код: Выделить всё
void ClientPutInServer( edict_t *pEntity ) {
   
   g_engfuncs->pfnClientCommand(pEntity,"jointeam 1");
   g_engfuncs->pfnClientCommand(pEntity,"joinclass 1");
   
   RETURN_META(MRES_IGNORED);
}


Плагин компилируется успешно, но при заходе игрока на сервер в консоли сервера появляются сообщения:
Tried to stuff bad command jointeam 1
Tried to stuff bad command joinclass 1

Если игрок, зайдя на сервер, сам напишет в консоли своего клиента команды "jointeam 1" и "joinclass 1", то у него корректно выберутся и команда, и класс.

В чем может быть проблема?
И есть ли более простой путь лишить игрока возможности выбора команды и класса при входе в игру, так чтобы ему не показывалось ни графическое ни текстовое меню выбора?
Аватара пользователя
Dekart
 
Сообщения: 16
Зарегистрирован: 04 май 2012, 09:45
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.

Re: Ошибка при отправке команды в консоль клиента

Сообщение DJ_WEST » 14 май 2012, 14:09

Вместо g_engfuncs->pfnClientCommand можно использовать CLIENT_COMMAND:
[pawn]
  1. #define CLIENT_COMMAND  (*g_engfuncs.pfnClientCommand)
[/pawn]
И скорей всего в конце твоих команд надо еще добавить \n:
[pawn]
  1. g_engfuncs->pfnClientCommand(pEntity,"jointeam 1\n");

  2. g_engfuncs->pfnClientCommand(pEntity,"joinclass 1\n");
[/pawn]
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Ошибка при отправке команды в консоль клиента

Сообщение PRoSToTeM@ » 14 май 2012, 18:43

Такое надо посылать прямо в двиг при первом синке игрока насколько я знаю.
Аватара пользователя
PRoSToTeM@
Скриптер
 
Сообщения: 2498
Зарегистрирован: 26 мар 2010, 00:12
Благодарил (а): 438 раз.
Поблагодарили: 1125 раз.

Re: Ошибка при отправке команды в консоль клиента

Сообщение quckly » 14 май 2012, 18:57

на конец команды нужно поставить \n или ;
Аватара пользователя
quckly
Скриптер
 
Сообщения: 403
Зарегистрирован: 20 ноя 2009, 10:03
Благодарил (а): 41 раз.
Поблагодарили: 243 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

Re: Ошибка при отправке команды в консоль клиента

Сообщение Dekart » 15 май 2012, 09:49

Переписал ClientPutInServer, вот так:
Код: Выделить всё
void ClientPutInServer( edict_t *pEntity ) {
   
   CLIENT_COMMAND(pEntity,"jointeam 1\n");
   CLIENT_COMMAND(pEntity,"joinclass 1\n");
   
   RETURN_META(MRES_IGNORED);
}

Ошибка в консоли пропала.

При этом я веду в лог команд клиента в консоли сервера через ClientCommand:
Код: Выделить всё
void ClientCommand( edict_t *pEntity ) {
   UTIL_LogPrintf(" CLIENT COMMAND %s %s\n", CMD_ARGV(0),CMD_ARGC() >= 1 ? CMD_ARGS() : "");
   RETURN_META(MRES_IGNORED);
}


При вызове CLIENT_COMMAND в ClientPutInServer перехват команды ClientCommand не происходит, также команды, отправленные во время выполнения ClientPutInServer, никак не проявляются. Выбор стороны и класса не происходит.
Но если CLIENT_COMMAND вызвать позже (через пару секунд после входа игрока на сервер), то команда выполнится и произойдет перехват.

Можно ли это как-то обойти? Поскольку за пару секунд игрок может вручную выбрать и сторону и класс, либо вообще лишить игрока этого выбора.
Аватара пользователя
Dekart
 
Сообщения: 16
Зарегистрирован: 04 май 2012, 09:45
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.

Re: Ошибка при отправке команды в консоль клиента

Сообщение quckly » 15 май 2012, 12:54

Dekart, выполни в PlayerThink_Post
Аватара пользователя
quckly
Скриптер
 
Сообщения: 403
Зарегистрирован: 20 ноя 2009, 10:03
Благодарил (а): 41 раз.
Поблагодарили: 243 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

Re: Ошибка при отправке команды в консоль клиента

Сообщение DJ_WEST » 15 май 2012, 14:55

При вызове CLIENT_COMMAND в ClientPutInServer перехват команды ClientCommand не происходит, также команды, отправленные во время выполнения ClientPutInServer, никак не проявляются. Выбор стороны и класса не происходит.

Все верно, потому что событие putinserver сработало, но игрок еще не совсем на сервере, он еще не принимает команды.
Можно ли это как-то обойти? Поскольку за пару секунд игрок может вручную выбрать и сторону и класс, либо вообще лишить игрока этого выбора.

Можно ловить либо показ вступительного MOTD, либо показ меню выбора команды, а там уже делать нужные тебе действия.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Ошибка при отправке команды в консоль клиента

Сообщение Dekart » 16 май 2012, 09:13

DJ_WEST писал(а):Можно ловить либо показ вступительного MOTD, либо показ меню выбора команды, а там уже делать нужные тебе действия.


Верно ли я понимаю, что "вступительное MOTD" это окошко с единственной кнопкой "Ок", которое появляется при входе в игру?

А как можно его отловить или отловить меню выбора команды?
Я подозреваю, что это делается как-то не стандартно...
Аватара пользователя
Dekart
 
Сообщения: 16
Зарегистрирован: 04 май 2012, 09:45
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.

Re: Ошибка при отправке команды в консоль клиента

Сообщение PRoSToTeM@ » 16 май 2012, 13:11

Тебе нужно сделать engclient_cmd (посмотри как сделан в исходниках AmxModX).
Хукнуть показ мотд можно через хук сообщения MOTD (посмотри как сделан хук в AmxModX).
Аватара пользователя
PRoSToTeM@
Скриптер
 
Сообщения: 2498
Зарегистрирован: 26 мар 2010, 00:12
Благодарил (а): 438 раз.
Поблагодарили: 1125 раз.

Re: Ошибка при отправке команды в консоль клиента

Сообщение Dekart » 18 май 2012, 11:40

Исходники AmxModX очень трудны понимания, поскольку этот плагин по сути мост для pawn, из-за чего в нем куча лишних абстракций, проверок и тд. Часто нужный нативный код не виден из-за всего этого или разнесён по разным местам.

В общем свою задачу я решил. Ниже решение, может кому понадобится...

----------------------

AmxModX помог мне слабо, но натолкнул на мысль сделать trace MessageBegin и MessageEnd функций.
Самый ранний момент, в который удалось отправить команды клиенту это вызов функции MessageBegin движком при формировании VGUIMenu сообщения для клиента. Хук для этой функции ставится через таблицу функций движка (enginefuncs_s в eliface.h в hlsdk). Подробнее можно посмотреть в исходниках trace_plugin, которые идут с метамодом.

Заголовок функции:
Код: Выделить всё
void MessageBegin(int msg_dest, int msg_type, const float *pOrigin, edict_t *ed)


При формировании VGUIMenu параметр msg_type примет значение 114, а параметр ed будет указывать на entity клиента, которому формируется сообщение.

Сам MOTD перехватить не удалось, и кстати в AmxModX он тоже не перехватывается, хотя там описан.
Аватара пользователя
Dekart
 
Сообщения: 16
Зарегистрирован: 04 май 2012, 09:45
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.

След.

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5