Разработчик
Скриптер
Проверенный
Участник
Пользователь
- Сообщения
- 273
- Реакции
- 424
- Помог
- 5 раз(а)
Я давно работаю над темой открытого мира в CS. На данный момент я пришёл к следующим пунктам:
1. Для начала нужно расширить границы мира на стороне игровой DLL, в частности изменить ограничения в CBaseEntity::IsInWorld() с +/-4096 юнита на максимально доступные для движка +/-32768. Так же необходимо подкорректировать файл delta.lst, что незначительно скажется на точности передачи координат игроков и объектов.
2. Повысить диапазон передачи координат для таких сообщений как svc_particle, svc_spawnstatic, svc_spawnstaticsound и svc_tempentity. На данный момент они передаются через MSG_WriteCoord() MSG_ReadCoord() (float / 8 => int16 => float * 8 ) и ограничены теми же +/-4096 юнитами.
3. Наверное самое главное, это оптимизация мира, так как при таких размерах wpoly и epoly будут очень высокими в связи с чем из-за устаревшего метода отрисовки в движке, точнее отправки данных в видеокарту, будет сильно просидать FPS.
4. С этим пунктом сложнее, так как для его реализации необходимо вмешиваться в движок на клиенте. Речь идёт о повышении максимального количества видимых entity, стандартное ограничение 256. В принципе этот пункт можно исключить, и при правильной оптимизации мира получить неплохие результаты и без него.
По перечисленным выше пунктам:1. Реализовать проще всего изменив исходники и пересобрав игровую DLL. Ну или эмулировать плагинами объекты класса CGrenade, CGib и т.д.
2. Я написал asi модуль для клиента который регистрирует в движке и обрабатывает так сказать расширенные сообщения являющиеся аналогами выше перечисленных в которых coord координаты заменены на float. В данный момент разрабатываю metamod модуль, который определяет по квару на клиенте установлена ли asi и в случае если да, то подменяет сообщения отправляемые игровой dll на расширенные. В скором будущем выложу сборку, если найдутся желающие потестить. Так же был бы рад если кто напишет плагин на amxx для теста вышеперечисленных сообщений, могу и сам, но времени не хватает, да и в очередной раз вникать в тонкости pawn нет желания.
3. В разработке система устройства мира по принципу деления игрового мира на сектора способные менять свой уровень детализации в зависимости от удаления от объекта. По этому пункту скажу сразу, что необходима своя игровая DLL, с новыми принципами построения списка видимых объектов, в частности по таким критериям как viewangle, fov, distance и некоторым другим. Последовательность построения карты будет следующая:
1) Создание ландшафта, например в TerrainGenerator из карты высот.
2) Прогонка получившегося MAP файла через специально написанную мной утилиту, которая группирует все браши ландшафта в сектора и задаёт им свойства, такие как порядковый номер (необходим для ассоциации с ними других объектов мира), двумерные координаты на плоскости мира для определения видимости ну и некоторые другие.
3) Автоматическое расставление объектов растительности. Думаю реализовать это в вышеупомянутой утилите.
4) Размещение объектов инфраструктуры в каком-нибудь редакторе карт, таких как здания, дороги, заборы, мосты и т.д. и корректировка растительности.
5) Прогонка получившегося MAP файла через очередную утилиту, которая будет преобразовывать brush модели в studio и объединять их в одну на сектор и создавать сабмодели с разной детализацией. Так же в brush модели будут добавляться браши, являющиеся хитбоксами studio моделей, это необходимо для обработки столкновений. Здесь мы уменьшим количество моделей на карте с может быть нескольких сотен, до нескольких десятков штук, упаковав в studio модели.
6) Далее получившийся набор из нескольких десятков секторов компилируем в BSP.
4. По этому пункту могу сказать только-то, что требуется свой клиент.
Здесь я, коротко не вдаваясь в подробности, изложил свои идеи, так как многое ещё не реализовано. Буду рад вашим предложения и дополнениям.