![]() |
Показать все 21 сообщений этой темы на одной странице |
HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Клавиша управления (https://hlfx.ru/forum/showthread.php?threadid=2045)
Клавиша управления
Добрый день.
Вопрос такой: как создать новую клавишу управления и назначить на её выполнение функцию в классе CBasePlayer соответствующего игрока?
Пробовал регистрировать новые клавиши там же, где и IN_RELOAD, IN_ATTACK и т.д. На клиенте регистрируются правильно - размер переменной (типа int) равен 32 битам, место есть. Однако переменная, передающая эти клавиши на клиент - short или unsigned short, если мне не изменяет память, то есть 16 бит, и все заняты. Изменение размера приводит к ошибке сегментации памяти (segmentation fault), что вполне естественно.
Пока вопрос решился перестановкой ненужных серверу клавиш вроде IN_SCORE за границу шестнадцатого бита - 1 << 16, 1 << 17 и т. д., а на их место установкой бита нужной клавиши. Но, скорее всего, есть более лёгкий способ, например, путём обработки консольной команды вроде connect [ip]. Как это сделать? Заранее благодарю.
Добавлено 04-01-2010 в 15:29:
Забыл сказать: игра - hl1.
0xf35
Насколько я помню, изначально в хл меньше 16 клавиш, и мне вполне удавалось добавить несколько своих. А ты пробовал изменить размер buttons в usercmd для передачи всех 32 битов?
В delta.lst она обозначена как
DEFINE_DELTA( buttons, DT_SHORT, 16, 1.0 )
__________________
Пробовал, приводило к ошибке сегментации. Но не знал про delta.lst. Спасибо, попробую.
code:
// Experimental player impact stuff. int impact_index; vec3_t impact_position;
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Изменил в usercmd.h
unsigned short buttons; на
int buttons;
Файл delta.lst скопировал в папку модификации. Вместо
DEFINE_DELTA( buttons, DT_SHORT, 16, 1.0 )
пробовал:
DEFINE_DELTA( buttons, DT_INTEGER, 32, 1.0 )
DEFINE_DELTA( buttons, DT_INTEGER, 16, 1.0 )
DEFINE_DELTA( buttons, DT_SHORT, 32, 1.0 )
Опять ошибка сегментации. Где я ошибся?
Дядя Миша, можно, хорошая мысль. Но это хирургическое вмешательство топором будет. Должен быть другой способ.
ну если в usercmd.h она прописана как 16-битная, то шансов нет. Только полный перекомпил движка (сорцов которого нет).
Так что остается хирургическое вмешательство топором, имхо.
__________________
Понятно, с битами клавиш только так, хотя тоже неплохо. Битов - хоть завались. А существует способ запускать определённую функцию из класса игрока при вводе определённой консольной команды?
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
__________________
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
__________________
Base Defense on Steam, ModDB
PLut я так понял, ему нужна клавиша, чтобы в игре определять, нажата она или нет. А такие только через pev->buttons передаются с клиента.
Хотя можно с алиасами похимичить
__________________
Дык такие клавиши вроде как в самом движке, это вот, которые IN_ALT?
__________________
Base Defense on Steam, ModDB
PLut движок их просто передает по сети.
Сам не подглядывает.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
__________________
В общем, в итоге получается, что проблему можно решить несколькими способами:
Подвинуть ненужные серверу клавиши, вроде IN_SCORE, за пределы 16 бит (/common/in_buttons.h). Можно использовать переменную int impact_index и структуру vec3 impact_position, в которой вообще ещё три переменные (imact_position.x, impact_position.y, impact_position.z). Но, если нет необходимости проверять состояние клавиши, лучше сэкономить место для других клавиш, и обработать её как консольную команду в функции ClientCommand в файле client.cpp. Команда, поступившая от конкретного игрока, будет обрабатываться кодом, относящимся к этому конкретному игроку - проблем никаких.
XaeroX, Дядя Миша, спасибо, проблема решена.
Да, и, Дядя Миша, к вопросу об unhandled exception и segmentation fault - здесь, скорее, второе. Unhandled exception возникает, когда какой-то объект вызвал exception, но он не был нигде обработан. А ошибка сегментации памяти - когда программа пытается записать или считать значение из сегмента памяти, ей не принадлежащего. Когда мы увеличиваем размер структуры, какая-то её часть выходит за пределы выделенного сегмента памяти - происходит ошибка сегментации.
Ещё раз, спасибо.
0xf35 я очень редко ловлю segfault. Это скорее для доса характерно, нежели для винды.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
На линуксе, когда я подобное вытворяю, у меня всегда выходит segmentation fault. Ради интереса написал консольную программку, вызывающую segmentation fault. Исходники одни и те же запускаю на разных платформах - на линуксе segmentation fault, на Windows - сообщение с отчётом (Отправить / Не отправлять). Windows просто не показывает, что конкретно произошло, да и в отладчике тоже почти всегда неясно - здесь, спасибо Microsoft, об этом можно только догадываться.
__________________
0xf35 ну можно по возвращемому адресу сделать некоторые выводы.
Например Acess Violation 0x00005 - это вызов указателя на функцию, который не проинициализирован.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Временная зона GMT. Текущее время 14:04. | Показать все 21 сообщений этой темы на одной странице |
На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024