При хостинг поддержке Интернет-сообщества VBIOS CS-Mapping.com.ua
Вернуться   CS-Mapping.com.ua > Forum > Картостроение > Модострой
Ник
Пароль
Регистрация Правила форума FAQ Пользователи Администрация Календарь Поиск За 24 часа Пометить все разделы прочитанными

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.11.2017, 14:07  #1
SNMetamorph
SNMetamorph
Рядовой
Регистрация: 09.11.2017
Сообщения: 20


Вопрос Предиктинг кастомных PM_* ивентов

Делая различные трюки для мода столкнулся с проблемой, уже при пинге 20-30 игра начинает сыпать предикшн-эррорами и дико трясти камеру. Весь код кастомных функций прописан в pm_shared.c, при поднятии на локальном сервере никаких проблем нет, если поднять fakelag до упомянутых 20-30 миллисекунд, то эти же самые проблемы начинают проявляться снова.
Ниже приведен код одной из функций:
Код:
void PM_Walljump()
{
			pmove->velocity[2] = sqrt(2 * 800 * 70.0);
			pmove->view_ofs[2] = 0;
			pmove->PM_PlaySound(CHAN_BODY,
"player/pl_duct3.wav", 0.9, ATTN_NORM, 0, PITCH_NORM);
			PM_FixupGravityVelocity();
			PM_CatagorizePosition();
}
Функция вызывается единожды при нажатии по клавише.
Что стоит предпринять для решения ошибок?
P.S: Пишу на последнем билде вельвовского голдсурса
SNMetamorph вне форума Ответить с цитированием
Старый 09.11.2017, 15:53  #2
a1batross
a1batross
Старшина
Регистрация: 06.01.2015
Адрес: Москва
Возраст: 19
Сообщения: 410


По умолчанию

А ты уверен, что единожды? Сделай проверку на pmove->oldbuttons, например.
a1batross вне форума Ответить с цитированием
Старый 09.11.2017, 16:36  #3
SNMetamorph
SNMetamorph
Рядовой
Регистрация: 09.11.2017
Сообщения: 20


По умолчанию

Уверен. Функция и вызывается по чеку клавиши.
SNMetamorph вне форума Ответить с цитированием
Старый 09.11.2017, 16:46  #4
Дядя Миша
Дядя Миша
Регистрация: 28.03.2010
Адрес: Кубань
Сообщения: 12,114


По умолчанию

viewofs не факт что предиктится правильно, были какие-то проблемы с этим.
Дядя Миша вне форума Ответить с цитированием
Старый 09.11.2017, 16:54  #5
SNMetamorph
SNMetamorph
Рядовой
Регистрация: 09.11.2017
Сообщения: 20


По умолчанию

А где можно хранить какую-либо кастомную информацию для PM_* функций?
Сую в fuser1 - сбрасывается. С другими полями для модов аналогично.
А если я создам структуру, создам массив из 32 структур, включу хидеры и .c файл в код и сервера и клиента и буду туда что-то записывать - не заруинит ли это весь предиктинг?
SNMetamorph вне форума Ответить с цитированием
Старый 09.11.2017, 18:41  #6
Дядя Миша
Дядя Миша
Регистрация: 28.03.2010
Адрес: Кубань
Сообщения: 12,114


По умолчанию

[ Цитата ] Сую в fuser1 - сбрасывается
В каком смысле - сбрасываются?
Дядя Миша вне форума Ответить с цитированием
Старый 09.11.2017, 19:54  #7
a1batross
a1batross
Старшина
Регистрация: 06.01.2015
Адрес: Москва
Возраст: 19
Сообщения: 410


По умолчанию

2 Дядя Миша:
он наверное пытается записать в fuser1 из PM, а он каждый SetupPMove затирается значением из клиентдаты.

2 SNMetamorph:
если тебе надо отправить какую-то инфу от сервера в клиентский PM и тебе прямо так хочется для этого заюзать f/v/iuser, то заполняй его в UpdateClientData. Но мне кажется, ты делаешь что-то не то. Вообще в этом случае тебе гонять информацию не надо.

Под единожды я имел ввиду, что функция вызывается только когда кнопка была нажата и больше не вызывается, пока не произойдёт отжатие и последующее нажатие снова. Т.е. не каждый кадр. Посмотри что для этого сделано в PM_Jump().
a1batross вне форума Ответить с цитированием
Старый 10.11.2017, 03:46  #8
SNMetamorph
SNMetamorph
Рядовой
Регистрация: 09.11.2017
Сообщения: 20


По умолчанию

[ Цитата ] Сообщение от a1batross: Под единожды я имел ввиду, что функция вызывается только когда кнопка была нажата и больше не вызывается, пока не произойдёт отжатие и последующее нажатие снова. Т.е. не каждый кадр. Посмотри что для этого сделано в PM_Jump().
Единожды она вызывается. Проверял уже и через дебаггер VS, и через Con_Printf.
[ Цитата ] Сообщение от Дядя Миша: В каком смысле - сбрасываются?

Приравниваются к нулю.

Последний раз редактировалось SNMetamorph, 10.11.2017 в 09:26. Причина: дополнение
SNMetamorph вне форума Ответить с цитированием
Старый 10.11.2017, 10:33  #9
Дядя Миша
Дядя Миша
Регистрация: 28.03.2010
Адрес: Кубань
Сообщения: 12,114


По умолчанию

2 SNMetamorph: ты прямо в PM_Move туда записываешь что-то?
Дядя Миша вне форума Ответить с цитированием
Старый 10.11.2017, 11:40  #10
SNMetamorph
SNMetamorph
Рядовой
Регистрация: 09.11.2017
Сообщения: 20


По умолчанию

[ Цитата ] Сообщение от Дядя Миша: 2 SNMetamorph: ты прямо в PM_Move туда записываешь что-то?
В PM_Walljump. Это ошибочное действие?
SNMetamorph вне форума Ответить с цитированием
Старый 10.11.2017, 12:11  #11
Дядя Миша
Дядя Миша
Регистрация: 28.03.2010
Адрес: Кубань
Сообщения: 12,114


По умолчанию

2 SNMetamorph: в pmove_t хотя и нет явного разделения, но все переменные делятся на ввод и вывод. Некоторые изменять нельзя - движок их перезатрёт. Некоторые можно и нужно - это результат работы пмува.
Навскидку можно менять оригин, велосити и флаги. Попозже точно скажу.
Дядя Миша вне форума Ответить с цитированием
Старый 10.11.2017, 12:19  #12
SNMetamorph
SNMetamorph
Рядовой
Регистрация: 09.11.2017
Сообщения: 20


По умолчанию

[ Цитата ] Сообщение от Дядя Миша: Все переменные делятся на ввод и вывод. Некоторые изменять нельзя - движок их перезатрёт. Некоторые можно и нужно - это результат работы пмува.
Воу. А есть какие-либо методы добавить в структуру полей? Или как-то по-другому увеличить лимит без потери предиктинга? А то рано или поздно, мне кажется, я упрусь в лимит.
SNMetamorph вне форума Ответить с цитированием
Старый 10.11.2017, 12:46  #13
Дядя Миша
Дядя Миша
Регистрация: 28.03.2010
Адрес: Кубань
Сообщения: 12,114


По умолчанию

Методы всегда какие-то есть.
Дядя Миша вне форума Ответить с цитированием
Старый 10.11.2017, 13:34  #14
SNMetamorph
SNMetamorph
Рядовой
Регистрация: 09.11.2017
Сообщения: 20


По умолчанию

А что насчет максимального количества оружия и его предиктинга на GS?
SNMetamorph вне форума Ответить с цитированием
Старый 10.11.2017, 14:05  #15
Дядя Миша
Дядя Миша
Регистрация: 28.03.2010
Адрес: Кубань
Сообщения: 12,114


По умолчанию

лимит на 64 пушки там.
Касательно добавления новых переменных.
Код:
char			sztexturename[256];
char			chtexturetype;
Ну вот какой жирный кусок, целых 256 байт. А имя текстуры не может быть длинее 16-и. Отъедай от него части и используй как тебе потребно.
Дядя Миша вне форума Ответить с цитированием
Старый 10.11.2017, 14:38  #16
SNMetamorph
SNMetamorph
Рядовой
Регистрация: 09.11.2017
Сообщения: 20


По умолчанию

[ Цитата ] Сообщение от Дядя Миша: лимит на 64 пушки там.
Касательно добавления новых переменных.
Код:
char			sztexturename[256];
char			chtexturetype;
Ну вот какой жирный кусок, целых 256 байт. А имя текстуры не может быть длинее 16-и. Отъедай от него части и используй как тебе потребно.
Ооо! Довольно-таки технично!
А как это можно сделать? Получить указатель на этот массив, потом прибавить к нему 16/32 байта (какая кодировка используется? ASCII же вроде бы), а потом уже создать указатель на float с полученным оффсетом?
SNMetamorph вне форума Ответить с цитированием
Старый 10.11.2017, 17:06  #17
Дядя Миша
Дядя Миша
Регистрация: 28.03.2010
Адрес: Кубань
Сообщения: 12,114


По умолчанию

[ Цитата ] А как это можно сделать?
Ну как-как. Написать
Код:
char			sztexturename[16];
int			reserved[60];
char			chtexturetype;
И из этого массива постепенно бери переменные и называй как тебе нравится. Вон целых 60 переменных доступно. Токо не двигай объявление, вот где есть, там и объявляй, снизу или сверху. Иээх, маладёж
Дядя Миша вне форума Ответить с цитированием
Старый 10.11.2017, 17:12  #18
SNMetamorph
SNMetamorph
Рядовой
Регистрация: 09.11.2017
Сообщения: 20


По умолчанию

[ Цитата ] Сообщение от Дядя Миша: Ну как-как. Написать
Код:
char			sztexturename[16];
int			reserved[60];
char			chtexturetype;
И из этого массива постепенно бери переменные и называй как тебе нравится. Вон целых 60 переменных доступно. Токо не двигай объявление, вот где есть, там и объявляй, снизу или сверху. Иээх, маладёж
Ого, вон оно как, а мне что-то сразу вспомнились обьединения из C++, и сразу пришла мысль сделать как-то на указателях, и вот буквально сейчас накидал код в CB, проверил - не работает.
Теперь буду делать предложенным методом.
А за инфу - спасибо огромное
SNMetamorph вне форума Ответить с цитированием
Старый 10.11.2017, 17:33  #19
Дядя Миша
Дядя Миша
Регистрация: 28.03.2010
Адрес: Кубань
Сообщения: 12,114


По умолчанию

2 SNMetamorph: движок это имя текстуры вообще никак не затрагивает, оно для него не существует. Все обращения только в pm_shared.c

Дядя Миша, подумав, добавил 10.11.2017 в 17:40
Теперь по поводу изменяемых переменных. В принципе назад копируется практически всё то, что копировалось в саму структуру pmove_t. Но поскольку код шареный, то на клиенте одно копируется, а на сервере другое. И мы ограничены тем набором, который задействуется в клиенте.
velocity
origin
punchangle
view_ofs
usehull
waterlevel
Теперь отвечая на вопрос, почему лагает твой код. Скорее всего ты там делаешь какие-то манипуляции с FL_ONGROUND. А халфовский предикт ВСЕГДА берёт значение этого флага с сервера. Вот тебе и лаг.

Последний раз редактировалось Дядя Миша, 10.11.2017 в 17:40.
Дядя Миша вне форума Ответить с цитированием
Старый 11.11.2017, 10:36  #20
SNMetamorph
SNMetamorph
Рядовой
Регистрация: 09.11.2017
Сообщения: 20


По умолчанию

Вчера доработал функцию. Теперь она принимает следующий вид:
Код:
void PM_WallJump()
{
	if (pmove->stamina >= 40.0) 
	{
			pmove->velocity[2] = sqrt(2 * 800 * 70.0);
			pmove->stamina -= 40.0f;
			pmove->PM_PlaySound(CHAN_BODY, "player/pl_duct3.wav", 0.9, ATTN_NORM, 0, PITCH_NORM);
			PM_FixupGravityVelocity();
			PM_CatagorizePosition();
         }
}

Также, подредактировал playermove_t
Код:
	char			sztexturename[16]; // Original size - 256 bytes
	float stamina;
        int alignvar[59];
	char			chtexturetype;

Стамина пополняется таким вот образом:
Код:
void PM_WalkMove()
{
...
	if (pmove->stamina < 120.0)
		pmove->stamina += 3 * 20.5 * pmove->frametime;
...
}

void PM_AirMove()
{
...
	if (pmove->stamina < 120.0)
		pmove->stamina += 14.25 * pmove->frametime;
...
}

Воллджамп вызывается так:
Код:
void PM_PlayerMove() 
{
     ...
     if (!(pmove->oldbuttons & IN_JUMP) && pmove->cmd.buttons & IN_JUMP)
     {
          PM_WallJump();
     }
     ...
}

Так вот - если в функции воллджампа делаю проверку на стамину - эррорит. Если не делаю - все окей, даже с пингом 300-400.
Можно ли как-то по-другому реализовать стамину, или пофиксить текущую реализацию?

Последний раз редактировалось SNMetamorph, 11.11.2017 в 10:37. Причина: блок кода уплыл вправо далеко-далеко
SNMetamorph вне форума Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 16:06.


Designed by FT-502, TRUP@C. Originally by Ulric Spaak
Hosted by: VBIOS.COM, Powered by: vBulletin
copyright © 2002 - 2017 by CS-Mapping.com.ua Community