HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Способы передачи количества боеприпасов с сервера на клиент
Или что за ??? с моим клиентом
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
Munky
while(true) {}

Дата регистрации: Mar 2013
Проживает: Berlin
Сообщений: 10

Рейтинг



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

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

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

Сообщить модератору | | IP: Записан
Сообщение: 118008

Старое сообщение 30-03-2013 07:43
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32205
Нанёс повреждений: 392 ед.

Рейтинг



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

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

Сообщить модератору | | IP: Записан
Сообщение: 118009

Старое сообщение 30-03-2013 07:54
-
Munky
while(true) {}

Дата регистрации: Mar 2013
Проживает: Berlin
Сообщений: 10

Рейтинг



Ок глянем! thx

Сообщить модератору | | IP: Записан
Сообщение: 118010

Старое сообщение 30-03-2013 07:57
- За что?
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6749
Возраст: 33

Рейтинг



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.
Хотя, может быть я в чём-то ошибаюсь, Дядя Миша меня поправит если чо

Сообщить модератору | | IP: Записан
Сообщение: 118011

Старое сообщение 30-03-2013 08:02
- За что?
Munky
while(true) {}

Дата регистрации: Mar 2013
Проживает: Berlin
Сообщений: 10

Рейтинг



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

Сообщить модератору | | IP: Записан
Сообщение: 118012

Старое сообщение 30-03-2013 08:19
- За что?
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6749
Возраст: 33

Рейтинг



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

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

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

Сообщить модератору | | IP: Записан
Сообщение: 118014

Старое сообщение 30-03-2013 09:26
- За что?
Munky
while(true) {}

Дата регистрации: Mar 2013
Проживает: Berlin
Сообщений: 10

Рейтинг



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

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

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

Сообщить модератору | | IP: Записан
Сообщение: 118015

Старое сообщение 30-03-2013 09:49
- За что?
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6749
Возраст: 33

Рейтинг



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

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

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

Сообщить модератору | | IP: Записан
Сообщение: 118017

Старое сообщение 30-03-2013 10:08
- За что?
Munky
while(true) {}

Дата регистрации: Mar 2013
Проживает: Berlin
Сообщений: 10

Рейтинг



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

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

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

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

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

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

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

Сообщить модератору | | IP: Записан
Сообщение: 118018

Старое сообщение 30-03-2013 10:28
- За что?
ONeiLL
CrazyUkrainian

Дата регистрации: Dec 2011
Проживает: Украина, Житомир
Сообщений: 562
Возраст: 26

Рейтинг



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

Сообщить модератору | | IP: Записан
Сообщение: 118024

Старое сообщение 30-03-2013 11:10
- За что?
Munky
while(true) {}

Дата регистрации: Mar 2013
Проживает: Berlin
Сообщений: 10

Рейтинг



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

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

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

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

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

Сообщить модератору | | IP: Записан
Сообщение: 118025

Старое сообщение 30-03-2013 12:13
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32205
Нанёс повреждений: 392 ед.

Рейтинг



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

Долго думал?

Сообщить модератору | | IP: Записан
Сообщение: 118030

Старое сообщение 30-03-2013 12:29
-
marikcool
Житель форума

Дата регистрации: Jul 2011
Проживает: kz
Сообщений: 1522
Возраст: 37

Рейтинг



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

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

__________________
vk.com/skullcapstudios

Сообщить модератору | | IP: Записан
Сообщение: 118044

Старое сообщение 30-03-2013 17:57
- За что?
ONeiLL
CrazyUkrainian

Дата регистрации: Dec 2011
Проживает: Украина, Житомир
Сообщений: 562
Возраст: 26

Рейтинг



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

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

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

Сообщить модератору | | IP: Записан
Сообщение: 118046

Старое сообщение 30-03-2013 18:34
- За что?
Munky
while(true) {}

Дата регистрации: Mar 2013
Проживает: Berlin
Сообщений: 10

Рейтинг



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

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

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

Отредактировано Munky 31-03-2013 в 08:41

Сообщить модератору | | IP: Записан
Сообщение: 118091

Старое сообщение 31-03-2013 08:55
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 17:34. Новая тема    Ответить
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Способы передачи количества боеприпасов с сервера на клиент
Или что за ??? с моим клиентом
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

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