Вопрос такой: как создать новую клавишу управления и назначить на её выполнение функцию в классе CBasePlayer соответствующего игрока?
Пробовал регистрировать новые клавиши там же, где и IN_RELOAD, IN_ATTACK и т.д. На клиенте регистрируются правильно - размер переменной (типа int) равен 32 битам, место есть. Однако переменная, передающая эти клавиши на клиент - short или unsigned short, если мне не изменяет память, то есть 16 бит, и все заняты. Изменение размера приводит к ошибке сегментации памяти (segmentation fault), что вполне естественно.
Пока вопрос решился перестановкой ненужных серверу клавиш вроде IN_SCORE за границу шестнадцатого бита - 1 << 16, 1 << 17 и т. д., а на их место установкой бита нужной клавиши. Но, скорее всего, есть более лёгкий способ, например, путём обработки консольной команды вроде connect [ip]. Как это сделать? Заранее благодарю.
0xf35
Насколько я помню, изначально в хл меньше 16 клавиш, и мне вполне удавалось добавить несколько своих. А ты пробовал изменить размер buttons в usercmd для передачи всех 32 битов?
В delta.lst она обозначена как
DEFINE_DELTA( buttons, DT_SHORT, 16, 1.0 )
0xf35 писал: Изменение размера приводит к ошибке сегментации памяти (segmentation fault)
по моему там обычный экзепшен вылетает. Но дело даже не в этом.
Дело в том, что по сети все равно передается только 16 бит.
Там еще есть пара неюзаных переменных:
code:
// Experimental player impact stuff.
int impact_index;
vec3_t impact_position;
ну если в usercmd.h она прописана как 16-битная, то шансов нет. Только полный перекомпил движка (сорцов которого нет).
Так что остается хирургическое вмешательство топором, имхо.
Понятно, с битами клавиш только так, хотя тоже неплохо. Битов - хоть завались. А существует способ запускать определённую функцию из класса игрока при вводе определённой консольной команды?
0xf35 писал: Изменил в usercmd.h
unsigned short buttons; на
int buttons;
нельзя так. у тебяж куча вещей подвинулась в клиенте, а в движке осталась по старым смещениям.
Цитата:
0xf35 писал: Но это хирургическое вмешательство топором будет
Это почему еще?
Есть отличная непоюзанная переменная - бери и пользуйся.
По другому тоже можно - например отправлять команды на сервер при помощи клиентских команд. На этом весь VGUI построен.
Разумеется на сервере команда приходит вполне конкретному игроку, а не кому попало.
Дядя Миша писал: нельзя так. у тебяж куча вещей подвинулась в клиенте, а в движке осталась по старым смещениям.
Согласен, потому меня и удивила возможность обозначать размеры элементов структуры в delta.lst - как оказалось, это действительно не так. Но проверить не мешало.
Цитата:
Дядя Миша писал: Это почему еще?
Просто изначально не предполагалось, что оно будет использоваться именно так. Существовала (уже не существует) опасность, что Valve измененит движок и задействует эти переменные - теперь, конечно, это невозможно. Спасибо, хорошая мысль, ничего не имею против.
Цитата:
XaeroX писал: Посмотри в client.cpp код ClientCommand.
Спасибо. Тоже очень полезный механизм - если уйти от темы клавиш.
0xf35 писал: потому меня и удивила возможность обозначать размеры элементов структуры в delta.lst
То у тебя возможность регулировать размер пересылаемых по сети данных. Если тебе надо отослать всего 8 бит, вместо 16 - это можно настроить. И сэкономить траффик.
Цитата:
0xf35 писал: Просто изначально не предполагалось, что оно будет использоваться именно так
Важно что оно не используется движком, зато передается по сети.
В других модах (например стратегиях), эти две переменные нужны, чтобы кликать юнитов, например. Или в инветаре копаться, выбирать предмет.
Оно для этого и было сделано. Но конечно никто не мешает заюзать для чего-нить другого.
0xf35 писал: Спасибо. Тоже очень полезный механизм - если уйти от темы клавиш.
Почему уйти от темы? Создаешь команду, набираешь в консоли - всё работает. А чтобы была клавиша, то бинди эту команду на кнопку, вот тебе и новая клавиша. Это тебе, наверно, XaeroX и хотел сказать
PLut я так понял, ему нужна клавиша, чтобы в игре определять, нажата она или нет. А такие только через pev->buttons передаются с клиента.
Хотя можно с алиасами похимичить