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

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

Все вопросы по скриптингу для 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 » 18 май 2012, 13:41

Dekart, если ты хукаешь MessageBegin, то ты можешь ловить через него все события. В частности MOTD:
Вы должны зарегистрироваться, чтобы видеть ссылки.

Тебе просто нужно узнать какой у него msg_type и сделать фильтрацию. Первый MOTD после захода игрока и будет вступительный, дальше хук уже не нужен.

Если ты фильтруешь VGUIMenu, то не забывай, что оно будет срабатывать за игру несколько раз. К тому же у VGUIMenu есть аргумент MenuID, по которому можно отфильтровать меню выбора команды.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
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 » 21 май 2012, 10:33

хм... MOTD в MessageBegin перехватить удалось, его msg_type 89. На первом перехваченном таком сообщении получилось отослать клиенту команду с последующим успешным её выполнением.

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

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

Сообщение DJ_WEST » 22 май 2012, 11:52

А можно ли заблокировать передачу какого-либо сообщения клиенту? Например для того чтобы не показывать ему меню выбора команды и класса.

Попробуй через:
[pawn]
  1. RETURN_META(MRES_SUPERCEDE);
[/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: Ошибка при отправке команды в консоль клиента

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

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

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

Сообщение DJ_WEST » 23 май 2012, 13:39

Скриншот ошибки - это хорошо. Только еще желательно выкладывать исходный код, если хочешь помощи.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
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@ » 23 май 2012, 15:44

В amxmodx сделано так: они блокируют все write_... и message_.... Если плагин посылает PLUGIN_HANDLED то amxmodx ничего не делает больше, а если PLUGIN_CONTINUE, то до этого запомнив все данные посылает её.
Аватара пользователя
PRoSToTeM@
Скриптер
 
Сообщения: 2498
Зарегистрирован: 26 мар 2010, 00:12
Благодарил (а): 438 раз.
Поблагодарили: 1125 раз.

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

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

DJ_WEST писал(а):Скриншот ошибки - это хорошо. Только еще желательно выкладывать исходный код, если хочешь помощи.


Вот код:
[pawn]
  1. bool MessageBegin(int msg_dest, int msg_type, const float *pOrigin, edict_t *ed)

  2. {

  3.         if (msg_type == 114) //VGUIMenu

  4.         {

  5.                 RETURN_META(MRES_SUPERCEDE);

  6.         }

  7.  

  8.         RETURN_META(MRES_IGNORED);

  9. }
[/pawn]

Как я понял, ошибка заключалась в том что MessageBegin перехватывался, а все последующие функции, имеющие отношение к отсылаемому сообщению, нет.

Переписал вот так, с добавлением функций на перехват MessageEnd и write*-функций

[pawn]
  1.  

  2. bool stopThisMessage;

  3. void MessageBegin(int msg_dest, int msg_type, const float *pOrigin, edict_t *ed)

  4. {

  5.         if (msg_type == 114) //VGUIMenu

  6.         {

  7.                 stopThisMessage = true;

  8.                 RETURN_META(MRES_SUPERCEDE);

  9.         }

  10.         else

  11.         {

  12.                 stopThisMessage = false;

  13.                 RETURN_META(MRES_IGNORED);

  14.         }

  15. }

  16. void MessageEnd(void)

  17. {

  18.         if (stopThisMessage)

  19.         {

  20.                 stopThisMessage = false;

  21.                 RETURN_META(MRES_SUPERCEDE);

  22.         }

  23.         else

  24.         {

  25.                 stopThisMessage = false;

  26.                 RETURN_META(MRES_IGNORED);

  27.         }

  28. }

  29. void WriteByte(int iValue)

  30. {

  31.         if (stopThisMessage)

  32.         {

  33.                 RETURN_META(MRES_SUPERCEDE);

  34.         }

  35.         else

  36.         {

  37.                 RETURN_META(MRES_IGNORED);

  38.         }

  39. }

  40. void WriteChar(int iValue)

  41. {

  42.         if (stopThisMessage)

  43.         {

  44.                 RETURN_META(MRES_SUPERCEDE);

  45.         }

  46.         else

  47.         {

  48.                 RETURN_META(MRES_IGNORED);

  49.         }

  50. }

  51. void WriteShort(int iValue)

  52. {

  53.         if (stopThisMessage)

  54.         {

  55.                 RETURN_META(MRES_SUPERCEDE);

  56.         }

  57.         else

  58.         {

  59.                 RETURN_META(MRES_IGNORED);

  60.         }

  61. }

  62. void WriteLong(int iValue)

  63. {

  64.         if (stopThisMessage)

  65.         {

  66.                 RETURN_META(MRES_SUPERCEDE);

  67.         }

  68.         else

  69.         {

  70.                 RETURN_META(MRES_IGNORED);

  71.         }

  72. }

  73. void WriteAngle(float flValue)

  74. {

  75.         if (stopThisMessage)

  76.         {

  77.                 RETURN_META(MRES_SUPERCEDE);

  78.         }

  79.         else

  80.         {

  81.                 RETURN_META(MRES_IGNORED);

  82.         }

  83. }

  84. void WriteCoord(float flValue)

  85. {

  86.         if (stopThisMessage)

  87.         {

  88.                 RETURN_META(MRES_SUPERCEDE);

  89.         }

  90.         else

  91.         {

  92.                 RETURN_META(MRES_IGNORED);

  93.         }

  94. }

  95. void WriteString(const char *sz)

  96. {

  97.         if (stopThisMessage)

  98.         {

  99.                 RETURN_META(MRES_SUPERCEDE);

  100.         }

  101.         else

  102.         {

  103.                 RETURN_META(MRES_IGNORED);

  104.         }

  105. }

  106. void WriteEntity(int iValue)

  107. {

  108.         if (stopThisMessage)

  109.         {

  110.                 RETURN_META(MRES_SUPERCEDE);

  111.         }

  112.         else

  113.         {

  114.                 RETURN_META(MRES_IGNORED);

  115.         }

  116. }

  117.  
[/pawn]

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

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

Сообщение noo00oob » 28 май 2012, 13:53

DJ_WEST писал(а):Все верно, потому что событие putinserver сработало, но игрок еще не совсем на сервере, он еще не принимает команды.


Ну так из client_connect то "принимает", хотя оно гораздо раньше путинсервера идет, в самом начале подключения, можно сказать.
Один фрукт, страдающий недостачей времени, нашел его ради меня любимого и писал(а):
noo00oob, зачем родился на свет вообще? срать на форумах это понятно.. больше изъеба не найти как бэ? а то, что ты недоношенная скотина, сдерживайся, детка.
noo00oob
 
Сообщения: 1061
Зарегистрирован: 09 янв 2010, 21:52
Благодарил (а): 258 раз.
Поблагодарили: 394 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

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

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

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

Пред.

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

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

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