HLFX.Ru Forum Страницы (2): [1] 2 »
Показать все 18 сообщений этой темы на одной странице

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=3864)


Отправлено Munky 30-03-2013 в 07:43:

Question Способы передачи количества боеприпасов с сервера на клиент

Доброго времени суток!
Дело в том что мне необходимо передать на клиент количество боеприпассов кастомных. но дело в том что у меня все переменные типа vuserN заняты (стандартными значениями). а если не заняты явно, то когда я их использую для описаных целей у меня начинают творится непонятные глюки с анимацией всех оружий. очевидно эти поля использует движок после заполнения переменной с типом clientdata_s на серверной dll.
Насколько я понял, из всех полей структуры clientdata_s наверняка свободно лишь поле iuser4, и то, я еще не проверял, ибо одного поля мне все равно мало, у меня три вида кастомных боеприпасов(+ хотелось бы добавить еще парочку). Я даже добавлял свои поля в эту структуру и все равно анимации глючат правда уже совсем по другому. Теперь у меня не проигрываются анимации выстрела ни на одном из оружий кроме, почемуто, gaussки (гаус стреляет на ура, все остальные оружия хорошо перезаряжаются, есть тряска экрана как надо все вообщем но только нет анимации стрельбы и muzzle flashа (но свет от него есть ))).
Все таки как лучше всего передавать ammo на клиент? Что я могу не правильно делать если другого способа не существует?
Какие поля точно свободны? Может быть можно в int запихать просто два байта (патронов все равно максимум 250 у меня) - в таком случае есть ли какие нибудь аналоги BitConverter`а платформы .NET ну или вообще как тут это делать? (просто я более сведущ в C# нежели в C++)

PS:Если это где-то это обсуждалось - пожалуйста не бейте тяжелыми предметами, я правда честно искал и у вас и в google ничего стоящего кроме неполного мутного описания этих полей не нашел.


Отправлено Дядя Миша 30-03-2013 в 07:54:

Цитата:
Munky писал:
Может быть можно в int запихать просто два байта (патронов все равно максимум 250 у меня)

Да лихко.
Смотри например как colormap упаковывается. Или функции PackRGBA UnpackRGBA.


Отправлено Munky 30-03-2013 в 07:57:

Ок глянем! thx


Отправлено Ku2zoff 30-03-2013 в 08:02:

Munky патроны, тащем-то, не обязательно передавать на клиент, если не хранить их в классе игрока и CBaseEntity соответственно. Например, есть у нас патроны ammo_9mm. Они передаются на клиент, чтобы синхронизировать int ammo_9mm в классе игрока на клиенте и на сервере. А есть патроны Hand Grenade. В классе игрока они не записаны и передавать вручную ничего не надо. Это какой-то рудимент от кваки, сохранение патронов в классе игрока. Отличие в том что, например в коде глока проверки на патроны такие:

C++ Source Code:
if ( m_pPlayer->ammo_9mm <= 0 )
  return;
Если не передавать значение на клиент, пушка будет глючить. А в коде гранат проверки такие:
C++ Source Code:
if ( !m_flStartThrow && m_pPlayer->m_rgAmmo[ m_iPrimaryAmmoType ] > 0 )
То есть в первом случае мы узнаём о патронах из класса игрока, а во втором из класса самого оружия. Так что сделай по примеру гранат и ничего не должно глючить.
Цитата:
Munky писал:
Может быть можно в int запихать просто два байта (патронов все равно максимум 250 у меня)

Здесь всё очень просто: сообщение, передающие на клиент количество патронов, использует WRITE_BYTE. Достаточно на сервере сменить это на WRITE_SHORT, ЕМНИП, это уже два байта, хватит за глаза. Ну и на клиенте соответственно, READ_SHORT.
Хотя, может быть я в чём-то ошибаюсь, Дядя Миша меня поправит если чо


Отправлено Munky 30-03-2013 в 08:19:

Ku2zoff, и вам спасибо за ответ!
Ну тогда это должно получится проще чем я думал.
А насчет разбиения int на байты и наоборот - там несколько другой контекст. там же поля структуры заполняются. там же не напрямую мессага отправляется оттуда. хотя возможно ее отправить откуда то еще. но от надо новую мессагу создавать и ловить ее на клиенте как то, верно?) в любом случае попробую пока просто сменить проверку патронов.)
Еще вопрос возник не по теме не много:
Вот у меня достаточно часто такая операция выполняется что например игрок телепортируется к монстру или например монстр с другим ентити меняются местами через origin. Можно ли запилить какойнить универсальный алгоритм чтобы он принимал желаемые новые координаты энтити а возвращал координаты, переместившись в которые монстр(или кто другой) бы не застрял. Просто может быть уже есть похожие наработки? чтобы мне велосипед не изобретать. К тому же это позволит мне например сделать на картах динамически генерируемых монстров (т.е. не через monstermaker и маппинг а полностью автоматически)
Стандартный алгоритм который просто возвращает BOOL не совсем подходит хотя может быть его можно взять за основу. Мнеж нужно не только узнать застрянет или нет. мне нужно найти подходящие координаты.


Отправлено Ku2zoff 30-03-2013 в 09:26:

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

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

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


Отправлено Munky 30-03-2013 в 09:49:

хм.. звучит не очень красиво.. но хотя если этим не спамить то лагать/вылетать не должно... Ок. Попробуем. если сделаю сюда залью может кому еще пригодится.
Я кстати просто убрал все что намутил с iuser и все. даже не менял ничего. уже не плохо. ток как то странно импульсный пулемет себя ведет. везде анимации норм но у него вместо стрельбы перезарядка все проверил все норм - почему так не понятно. с моделью сравнил. енумы все перепроверил... странно. И не рисует импульсные трейсеры. Я как бы как сделал. до тех пор пока в клиент полностью не добавил пулемет - стреляло нормально. а как в клиент добавил у меня кастомные трейсеро-имитаторы () пропали. не рисует. если игрок ими стреляет. я сделал клоны FireBulletsPlayer/FireBullets в тот же класс CBaseEntity которые делают тоже самое но вместо месаги о трейсере рисуют (если память не изменяет) тоже месагой но кусок луча с нужной мне текстурой. ну и при попадании в стену там код чутка другой. Вот. это дело я засунул по #if defined(CLIENT_WEAPONS) точнее в ветку else этого условия. ииии... ничего. ничего не рисует. не вижу куда стреляю и чем стреляю. а вот монстры стреляют нормально как и раньше импульсными пулями(что не удивительно). Как свои трейсеры нормально сделать на клиенте в моем случае?
Может мне полностью склонировать FireBullets клиентский так же как и серверный вместо того чтобы совсем эту команду не обрабатывать?

Добавлено 30-03-2013 в 13:49:

я наверно зря сделал if defined сделал. там другой макрос проверять надо. знать бы еще какой.


Отправлено Ku2zoff 30-03-2013 в 10:08:

Цитата:
Munky писал:
но у него вместо стрельбы перезарядка

Не забывай перекомпиливать клиент после изменений оружия.
Цитата:
Munky писал:
CLIENT_WEAPONS

Вне этого условия вставляй эффекты и будет ништяк. Это для предиктинга, и по умолчанию дефайн CLIENT_WEAPONS стоит в проекте. А если ты засунул условие после else, то естественно ничего работать не будет, пока не уберёшь дефайн.


Отправлено Munky 30-03-2013 в 10:28:

Цитата:
Ku2zoff писал:
Не забывай перекомпиливать клиент после изменений оружия.

Компилил я. сервер, за ним клиент. пофигу вообще. все равно RELOADами стреляет. хотя вот тут как раз дело с темой про боеприпасы может быть. может быть клиент думает что у нас патронов ноль и таким образом это проявляет?))
Цитата:
Ku2zoff писал:
Вне этого условия вставляй эффекты

То есть наоборот надо все)
а в клиенте он не ставится, этот дефайн?
а то без тупости которой я сделал, линковщик ругался на то что я не реализовал функции. а с ней не ругается ведь.

Добавлено 30-03-2013 в 14:25:

Кстати у меня функция Reload как таковой перезарядки не делает. и раньше без клиента этой анимации вообще не было. точнее она просто никогда не проигрывалась. Потому что никогда не вызывалась. Пулемет то как пулемет на airboat в HL2. т.е. регенерация патронов

Добавлено 30-03-2013 в 14:28:

Во я в коде монтировки нашел. может лучше писать #ifndef CLIENT_DLL?


Отправлено ONeiLL 30-03-2013 в 11:10:

Munky если ты напишешь код в блоке #ifndef CLIENT_DLL ....... #endif то он будет компилироваться только на сервере. Кстать, у себя в моде я вырезал нафиг клиентские пушки, потому что толку от них почти не заметно даже в игре по сети.


Отправлено Munky 30-03-2013 в 12:13:

ONeiLL, а я именно этого и хочу . Во всяком случае сейчас. Потому что отрисовывать на клиенте специально мне импульсные трейсеры не нужно на данный момент. Потому что они сервером отправляются клиенту как лучи и без клиентской части работают на ура. Я сделал #ifndef CLIENT_DLL везде где нужно было, сейчас с этим все супер.
Осталось лишь понять почему импульсный пулемет стреляет неправильными анимациями.

Цитата:
ONeiLL писал:
я вырезал нафиг клиентские пушки

Вот я пулемет и еще одну пушку создавал без клиентской части изначально. эт я их сейчас переношу поскольку наконец починил клиент. Тык они у меня и раньше и сейчас правильно не стреляют всмысле анимаций. в чем может быть дело? PLAYER_ATTACK1 отправляю event тоже. анимации все на сто раз проверял.
Кстати такой вопрос вот на клиенте в ev_hldm.cpp в стандартных методах обработки евентов для стандартных оружий есть вызов функции которая устанавливает анимацию выстрела. Вот скажите, за что отвечает у нее второй аргумент? это я так понял bodygroup view-модели. почему он используется в Python например мне понятно. но почему у MP5 в аналогичном месте стоит цифра 2? в модели вообще везде бодигруппы по одной штуке идут. При этом конкретно MP5 работает у меня идеально.

Добавлено 30-03-2013 в 16:13:

Я этого не мог заметить целый год. А сейчас заметил!
Я им ивенты чужие кидал. Вот шо значит копипастить) Правда мне можно, сам у себя копировал) Сейчас должно все работать Всем спасибо!!!


Отправлено Дядя Миша 30-03-2013 в 12:29:

Цитата:
Ku2zoff писал:
Чтобы не застрял, нужно трейсить во все шесть сторон на расстояние, равное размерам хулла монстра

Долго думал?


Отправлено marikcool 30-03-2013 в 17:57:

Цитата:
ONeiLL писал:
Кстать, у себя в моде я вырезал нафиг клиентские пушки, потому что толку от них почти не заметно даже в игре по сети.

при пинге 50мс уже заметно, нужно перед каждым выстрелом ждать 50мс, пока сервер ответит.

__________________
vk.com/skullcapstudios


Отправлено ONeiLL 30-03-2013 в 18:34:

marikcool с пингом 200 ганял и терпимо. + С клиентскими пухами у меня глушители на ЮСП и М4А1 глючили О_о

Добавлено 30-03-2013 в 21:34:

http://www.youtube.com/watch?featur...&v=636QtNzXU7E#!
4:28 - там глюки с глушаком будут


Отправлено Munky 31-03-2013 в 08:55:

Супер вопрос: float в мессагах передается WRITE_COORD()? сколько оно байт занимает?

Добавлено 31-03-2013 в 13:55:

Вообщем я регистрирую message через REG_USER_MSG в переменную и у меня в переменной после этого дела остается 0. Чем это может быть вызвано?


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

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