HLFX.Ru Forum Страницы (2): [1] 2 »
Показать все 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)


Отправлено 0xf35 04-01-2010 в 12:29:

Клавиша управления

Добрый день.

Вопрос такой: как создать новую клавишу управления и назначить на её выполнение функцию в классе 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.


Отправлено XaeroX 04-01-2010 в 12:36:

0xf35
Насколько я помню, изначально в хл меньше 16 клавиш, и мне вполне удавалось добавить несколько своих. А ты пробовал изменить размер buttons в usercmd для передачи всех 32 битов?
В delta.lst она обозначена как
DEFINE_DELTA( buttons, DT_SHORT, 16, 1.0 )

__________________

xaerox on Vivino


Отправлено 0xf35 04-01-2010 в 13:51:

Пробовал, приводило к ошибке сегментации. Но не знал про delta.lst. Спасибо, попробую.


Отправлено Дядя Миша 04-01-2010 в 13:56:

Цитата:
0xf35 писал:
Изменение размера приводит к ошибке сегментации памяти (segmentation fault)

по моему там обычный экзепшен вылетает. Но дело даже не в этом.
Дело в том, что по сети все равно передается только 16 бит.
Там еще есть пара неюзаных переменных:
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'


Отправлено 0xf35 04-01-2010 в 14:02:

Изменил в 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 )

Опять ошибка сегментации. Где я ошибся?

Дядя Миша, можно, хорошая мысль. Но это хирургическое вмешательство топором будет. Должен быть другой способ.


Отправлено XaeroX 04-01-2010 в 14:10:

ну если в usercmd.h она прописана как 16-битная, то шансов нет. Только полный перекомпил движка (сорцов которого нет).
Так что остается хирургическое вмешательство топором, имхо.

__________________

xaerox on Vivino


Отправлено 0xf35 04-01-2010 в 14:14:

Понятно, с битами клавиш только так, хотя тоже неплохо. Битов - хоть завались. А существует способ запускать определённую функцию из класса игрока при вводе определённой консольной команды?


Отправлено Дядя Миша 04-01-2010 в 14:43:

Цитата:
0xf35 писал:
Изменил в usercmd.h
unsigned short buttons; на
int buttons;

нельзя так. у тебяж куча вещей подвинулась в клиенте, а в движке осталась по старым смещениям.
Цитата:
0xf35 писал:
Но это хирургическое вмешательство топором будет

Это почему еще?
Есть отличная непоюзанная переменная - бери и пользуйся.
По другому тоже можно - например отправлять команды на сервер при помощи клиентских команд. На этом весь VGUI построен.
Разумеется на сервере команда приходит вполне конкретному игроку, а не кому попало.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено XaeroX 04-01-2010 в 14:52:

Цитата:
0xf35 писал:
А существует способ запускать определённую функцию из класса игрока при вводе определённой консольной команды?

Ну да... Посмотри в client.cpp код ClientCommand.

__________________

xaerox on Vivino


Отправлено 0xf35 04-01-2010 в 15:16:

Цитата:
Дядя Миша писал:
нельзя так. у тебяж куча вещей подвинулась в клиенте, а в движке осталась по старым смещениям.

Согласен, потому меня и удивила возможность обозначать размеры элементов структуры в delta.lst - как оказалось, это действительно не так. Но проверить не мешало.
Цитата:
Дядя Миша писал:
Это почему еще?

Просто изначально не предполагалось, что оно будет использоваться именно так. Существовала (уже не существует) опасность, что Valve измененит движок и задействует эти переменные - теперь, конечно, это невозможно. Спасибо, хорошая мысль, ничего не имею против.
Цитата:
XaeroX писал:
Посмотри в client.cpp код ClientCommand.

Спасибо. Тоже очень полезный механизм - если уйти от темы клавиш.


Отправлено Дядя Миша 04-01-2010 в 16:06:

Цитата:
0xf35 писал:
потому меня и удивила возможность обозначать размеры элементов структуры в delta.lst

То у тебя возможность регулировать размер пересылаемых по сети данных. Если тебе надо отослать всего 8 бит, вместо 16 - это можно настроить. И сэкономить траффик.
Цитата:
0xf35 писал:
Просто изначально не предполагалось, что оно будет использоваться именно так

Важно что оно не используется движком, зато передается по сети.
В других модах (например стратегиях), эти две переменные нужны, чтобы кликать юнитов, например. Или в инветаре копаться, выбирать предмет.
Оно для этого и было сделано. Но конечно никто не мешает заюзать для чего-нить другого.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено PLut 05-01-2010 в 09:44:

Цитата:
0xf35 писал:
Спасибо. Тоже очень полезный механизм - если уйти от темы клавиш.


Почему уйти от темы? Создаешь команду, набираешь в консоли - всё работает. А чтобы была клавиша, то бинди эту команду на кнопку, вот тебе и новая клавиша. Это тебе, наверно, XaeroX и хотел сказать

__________________
Base Defense on Steam, ModDB


Отправлено XaeroX 05-01-2010 в 10:14:

PLut я так понял, ему нужна клавиша, чтобы в игре определять, нажата она или нет. А такие только через pev->buttons передаются с клиента.
Хотя можно с алиасами похимичить

__________________

xaerox on Vivino


Отправлено PLut 05-01-2010 в 12:13:

Дык такие клавиши вроде как в самом движке, это вот, которые IN_ALT?

__________________
Base Defense on Steam, ModDB


Отправлено Дядя Миша 05-01-2010 в 12:22:

PLut движок их просто передает по сети.
Сам не подглядывает.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Временная зона GMT. Текущее время 23:23. Страницы (2): [1] 2 »
Показать все 21 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024