Дядя Миша я не очень понимаю, что делаю. Вроде бы оно должно работать. Но тут же, я чувствую, что движок - это не дллки, и кое-где нужны исправления. Ну вот хотя бы с модельиндексами. model_precache нужно обнулять при смене карты (когда грузится именно другой bsp-файл, чтобы модельиндексы моделей, загруженных в движке совпадали с модельиндексами моделей, заргуженных в дллке).
Натыкаю алертов и посмотрю, что не так. Надеюсь, что-то получится в итоге.
Так, кое-в чём разобрался. MOVETYPE_NOCLIP прекрасно работает. Значит, дело либо в функции SV_Move, либо в хуллах студиомодели.
Добавлено 31-03-2017 в 23:21:
Есть подозрение, что проблема в векторах. Идёт конфликт с классом Vector, описанным в vector.h и движковым vec3_t. Из-за этого трейсы работают неправильно. Раздефайнил vec3_t, задефайнил снова, но уже как в движке: граната теперь не застревает в воздухе, как в солиде (раньше издавала звуки ударов об мир), а просто висит, не получая ускорения и воздействия гравитации. Буду копать дальше.
Самое главное, что кастомная физика вполне себе работает. Что видно на примере MOVETYPE_NOCLIP. А значит вся эта возня не зря, нужно только победить оставшиеся проблемы.
Добавлено 01-04-2017 в 00:02:
Готово! Гранаты залетали как надо. Это я дурак, нефиг комментить куски кода, не разобравшись, зачем они нужны Сейчас очередь за монстрами.
Добавлено 01-04-2017 в 00:54:
Ну и сдаётся мне, что придётся ещё тащить куски pmove в дллку, чтобы игрок взаимодействовал с энтитями. А то они стали весьма несолидными для него. Гранаты, например, толкают пушабли, а игрок нет. Но используя кнопку use, игрок может тягать и толкать пушабли. Лишь бы всё это дело работало по сети и с предиктингом, т.к. весьма неохота ещё что-то ковырять в клиенте. И есть ещё проблема: брашевые энтити с movetype_push. Им ещё в добавок придётся выставлять SOLID_NOT, чтобы движок не ругался на SOLID_BSP without MOVETYPE_PUSH.
Короче, скоро будет какой-нибудь результат. Я надеюсь на это. Демку с исходником карты, где всё уменьшено в два раза, точно приложу.
Дядя Миша писал: Это ты просто не те хидеры добавил.
Да, верно. Ну с этим разберёмся. Кстати, научил энтити коллайдить с игроком: запихнул вызов SV_AddLinksToPmove перед вызовом PM_Move. Игрок конечно может застревать в энтитях, да и сами энтити друг в дружке тоже. Но! Наконец-то код работает, есть результат. Уч0ные и пушабли двигаются и не проваливаются в пол. Обнаружил новую проблему, которая кроется вот в этом:
C++ Source Code:
// это оригинальный код:
mins = VEC_HULL_MIN;
maxs = VEC_HULL_MAX;
C++ Source Code:
// а это правильный код:
VEC_HULL_MIN.CopyToArray( mins );
VEC_HULL_MAX.CopyToArray( maxs );
При использовании оригинального кода игрок правильно взаимодействует с миром, но не может подойти вплотную к энтитям, т.к. размер сторон его хуллов всё равно остаётся 8х8x36 и 8x8x18. При использовании правильного кода, игрок нормально подходит к энтитям, но проваливается в мир наполовину. То есть у нас здесь теперь обратная ситуация. Теперь игрок проваливается.
Похоже, придётся ещё лезть в клиент из-за брашевых энтить, которые не могут быть без MOVETYPE_PUSH или MOVETYPE_PUSHSTEP. Чтобы конкретно обмануть движок, этим энтитям надо выставить SOLID_NOT. Если на сервере всё более-менее решаемо, и везде, где надо можно подсунуть iuser1 вместо movetype, а iuser2 вместо solid, то на клиенте кажется с этим посложнее. Но, в принципе, можно сделать обманку в функции HUD_Frame по аналогии с StartFrame на сервере. Ну это станет видно, когда прочие энтити заработают нормально, и я проверю их взаимодействие с энитями, у которых SOLID_BSP, которые пока обрабатывает движок.
Интересно, как в HLFX 0.7 решена эта проблема? Ведь почти все брашевые энтити имеют SOLID_BSP. Кроме триггеров и пушаблей.
Маленький отчёт о проделанной работе, эдакое резюме по 10 страницам темы, после того как я активно заинтересовался масштабированием:
Сделана загрузка моделей серверной дллкой и построение своей собственной index replacement table. v.modelindex какого-либо эдикта указывает на одинаковые модели из движковой и из собственной таблицы. Ну то есть не совсем одинаковые. В дллке я выбросил загрузку некоторых компонентов моделей, таких как текстуры или инфа об освещении и видимости, т.к. для кода физики и движения это не нужно.
Произведена грубая копипаста кода физики для некоторых мувтипов. Как из ксаша, так и из rehlds. На первый взгляд разницы нет (но в ксаше код грамотнее и читаемее), нужно тестировать и править недочёты. На данный момент получилось заставить нормально работать пушабли, гранаты и учёных.
Я как раз дошёл до того самого момента, где физика энтить взаимодействует с физикой игрока. И вот тут наткнулся на интересную вещь. Нужно грамотным образом изменить player_mins и player_maxs, для правильной колоизации игрока и энтить. Когда я это одолею, можно будет сказать, что задача решена. И только тестировать код в поисках мелких багов и в работе по сети. Демку я обязательно дам вам на растерзание, но как скоро не знаю.
Добавлено 05-04-2017 в 16:29:
З.Ы. Всё для обычной халфы, конечно. Юзая ксаш, можно изменить размеры хуллов в гейминфо и поставить квар sv_quakehulls 2. И не делать всего этого.
З.З.Ы. Для чего это нужно в халфе (в ксаше не нужно, т.к. карты там можно делать гораздо больше 8192х8192х8192): не увеличивая размер карты, увеличить её размер относительно игрока и энтить, для создания больших пространств или карт с поездами (типа AS-HiSpeed), например.
Строго говоря, если бы требовалось только поменять размер хуллов, я бы просто на клиенте получил все модели перебором и позаменял бы там корочи hull_mins и hull_maxs, как я это проделывал в римейке кваки.
А то что в SV_HullForBsp код немного не такой - это по большому счёту, плевать. Оно было критично для халфы, а не для кваки. Иными словами, если юзать этот код из кваки для халфы, там да - сидящие доктора и пушабли будут застревать. Для кваки же халфовский вариант прекрасно подходит.
Так что по суте всё бы ограничилось одной простенькой функцией подмены значений в хуллах. Но мыж лёгих путей неищем. Нам надо полгода копипастить из движка в дллку ради какой-то ерунды.
Откуда же знать, какой путь лёгкий? Опыт приобретается во время практики. Лишним всё равно не будет. Я конечно погляжу римейк кваки на досуге, чего там такого особенного.
Добавлено 05-04-2017 в 23:14:
Цитата:
Дядя Миша писал: сидящие доктора и пушабли будут застревать.
Вот пушабли-то очень нужны на самом деле. Халфовский геймплей наполовину состоит из махинаций с пушаблями.
Добавлено 05-04-2017 в 23:21:
Цитата:
Дядя Миша писал: ради какой-то ерунды.
А есть другой вариант увеличить размер карты в халфе? Без использования ксаша? Тутор БУзера не подходит, т.к. там тэмпэнтити ломаются.
Дядя Миша писал: я бы просто на клиенте получил все модели перебором и позаменял бы там корочи hull_mins и hull_maxs, как я это проделывал в римейке кваки.
Взял код из римейка кваки. Игрок перестал нырять в стены и проваливаться в пол, при использовании правильного кода в GetHullBounds. Монстры ходят нормально и тоже не проваливаются в пол. Только пушабли действительно застревают. Нужно починить им кастомную физику (которую я уже скопипастил).
Тут в первом посте темы есть ссылка на тутор с wavelength. И там есть функция, описанная дебильным словосочетанием "Entropy's omegafied code", PM_FixModelHulls. Так вот, она то ли не работает, то ли работает неправильно. Функция из римейка кваки, CL_MergeHulls, делает то же самое что и эта, но работает.
Сейчас сделаю карту с поездом, чтобы проверить, нужно ли ещё менять масштаб, или текущего будет достаточно.
Добавлено 06-04-2017 в 13:48:
В длину на карте теперь умещается 18 вагонов. Если в упор к скайбоксу - 17. По диагонали 25. По сравнению с 5-ю вагонами в длину при обычных размерах, это очень даже хорошо. Размеры вагона (ШхВхД) 78х104х400. Относительно размеров игрока или монстров выглядят такие вагоны как ИРЛ. Но вот внутри кажутся тесноватыми, как собственно все помещения, намапленные с точным соблюдением пропорций и размеров.
~ X ~ ну, собственно, это и придётся сделать. Это даже плюсом будет - переделать все эффекты на RS.
Что-то Гуль пропал из этой темы. Ему стоит попробовать сделать патч для Тириана с изменением размеров хуллов по типу римейка кваки. Может быть все проджектайли починятся.
Ku2zoff он уехавший. Кроме того, он перешёл на тему зомбятника. А вообще - да, мы хотели запилить масштабы. Но так может дойти и до переписывания движка в ДЛЛках.
~ X ~ писал: А вообще - да, мы хотели запилить масштабы.
А чего там пилить? Перекомпилить карты, сменить значения в дллках, да вставить функции CL_MergeHulls из римейка кваки и PM_UpdateClipBox из тутора с wavelength. Для игроков и проджектайлов всё должно заработать. Я попробовал, у меня всё нормально работает.