25 января 2006
Обновлено 17.05.2023

Гонки на поле боя. Battlefield 2, часть 2

Гонки на поле боя. Battlefield 2, часть 2 - изображение обложка

По полю боя на бешеных скоростях несутся к финишу два джипа. Идут вровень, ведя ожесточенную борьбу. Один из гонщиков начинает понемногу вырываться вперед. Другой, не желая уступать, начинает его таранить. Тот отвечает тем же. Так оппоненты толкаются до крутого поворота. На нем уходящая в отрыв машина, получив от другой удар в бок, с грохотом вылетает на обочину… Непривычная, согласитесь, для Battlefield 2 картина?! А между тем после сегодняшнего “вскрытия” подобное станет возможным. Ведь мы превратим Battlefield 2 в самые настоящие аркадные автогонки.

Финиш

Первое, что мы сделаем, это посетим директорию < Каталог игры>\mods\bf2\Levels. Она разбита на подкаталоги, каждый из которых отвечает за определенную карту. Прежде всего вы должны определиться, на базе какой из них вы будете создавать гоночную трассу. В качестве наглядного примера возьмем карту Dalian Plant , а точнее — ее вариант, рассчитанный на 16 игроков (упоминая далее этот уровень, мы будем иметь в виду именно эту конфигурацию карты). Cтоит сразу оговориться, что предложенная далее схема подходит абсолютно для всех уровней. Однако, если вы задействуете какую-то другую карту, вам придется больше экспериментировать с подходящей расстановкой контрольных пунктов и точек респавна.

При налаживании трассы мы будем потрошить архив server.zip из папки карты. А в нем нам в первую очередь понадобится папка \GameModes. Она посвящена режимам игры, доступным на данном уровне: многопользовательский (ему соответствует подкаталог \gpm_cq ) и одиночный ( \sp1 ).

Обратимся к последнему. Откроем в стандартном “Блокноте” файл GamePlayObjects.con , лежащий в директории \sp1\16. Структуру файла с таким именем мы разбирали в предыдущем “вскрытии” игры. Так что в случае чего обращайтесь к тому материалу.

Зададим место финиша трассы. Для этого подредактируем третью часть файла — Control Points , отвечающую за расстановку контрольных точек. Всем точкам (в примере с уровнем Dalian Plant их четыре) нужно присвоить одинаковые координаты. Делается это с помощью правки значения параметра Object.absolutePosition во всех подразделах (каждый из них соответствует отдельному контрольному пункту, поэтому в нашем случае их четыре) второго блока (начинается после строки if v_arg1 == host ). Обратите внимание на то, что первое число в значении этого атрибута соответствует оси X , второе — Z , третье — Y. Все эти числа нужно заменить координатами одной из имеющихся контрольных точек и немного подкорректировать полученное значение, чуть сдвинув пункт по оси X или Y. Это перемещение позволит сместить в сторону столб с флагами наций, убрав его из огражденной зоны. А игрокам, финишируя, не придется объезжать дополнительные препятствия.

Если говорить о карте Dalian Plant, то на ней для финиша можно использовать слегка измененное месторасположение пункта под названием Reactors (имя подраздела указано в конце его первой — закомментированной — и второй строк) — 88.000/153.170/-32.000. После произведенной операции все контрольные точки карты переместятся в одну точку, расположенную прямо на дороге. Эта точка и будет финишем.

Помимо координат необходимо поменять командную принадлежность контрольных точек. Одна из них обязательно должна быть на момент начала игры собственностью первой команды, еще одна — второй. Иначе солдаты попросту не смогут “родиться”. Чтобы этого не произошло, убедитесь в том, что один из подразделов первого блока несет в себе строку ObjectTemplate.team 1 , а еще один — ObjectTemplate.team 2. Остальные этот параметр содержать не должны — то есть относящиеся к ним контрольные точки должны быть нейтральными.

Что касается уровня Dalian Plant, то здесь в плане принадлежности точек той или иной команде ничего менять не нужно. Одна из них ( Powerplant ) и так уже принадлежит китайцам, другая ( Constructionsite ) — американцам. Оставшиеся две ( Reactors и Mainentrance ) нейтральны.

Есть и еще одно важное преобразование, которое необходимо проделать над контрольными пунктами. По умолчанию, чтобы захватить любой из них, игрок должен постоять рядом с ним в течение десятка, а то и более секунд. В нашем случае это явно лишнее. Чтобы гонщику, прибывшему первому на финиш, не приходилось долго дожидаться победы, скорректируем значения характеристик ObjectTemplate.timeToGetControl (задает время, которое требуется для захвата данной контрольной точки в случае, если она нейтральна) и ObjectTemplate.timeToLoseControl (время, уходящее на нейтрализацию данной контрольной точки, если ею владеет соперник) во всех подразделах первого блока из части файла Control Points. Во всех случаях обоим показателям ставим значение 1. Теперь победитель заезда, как и положено, будет объявляться сразу по прибытию на финиш.

Осталось только уменьшить радиус контрольных пунктов карты до отметки 3. Иначе участники гонок смогут финишировать, находясь на почтительном расстоянии от самой точки финиша. Чтобы это исправить, в этих же подразделах подредактируйте значение характеристики ObjectTemplate.radius.

На старт…

Теперь определим точку старта. В этом нам поможет вторая часть ( Spawn Points ) файла, в которой прописаны точки респавна. Обратите внимание на то, что некоторые из них имеют схожие имена: на конце первых двух строк соответствующих им подразделов стоит одно и то же слово, но за ним следуют различные числа. Например, на карте Dalian Plant есть более десятка мест респавна с именем CPNAME_DP_SP16_mainentrance_X , где X — число, позволяющее отличить точку от подобных. Такие подразделы относятся, по сути, к одной локации и представляют собой возможные варианты “появления на свет” солдата в ее пределах. Причем “родственные” точки располагаются очень близко друг к другу, что заметно по их координатам.

Оставим на карте только две любые точки респавна, наделенные схожими именами. Говоря о Dalian Plant, пусть это будут пункты mainentrance_7 и mainentrance_10. А остановили мы выбор именно на этих двух точках, так как они находятся далеко от финиша. Если вы работаете с какой-то другой картой, посмотрите, чтобы один из оставшихся пунктов максимально расходился в координатах (главным образом по первой и третьей) с точкой финиша. Это нужно для того, чтобы трасса не получилась слишком уж короткой.

Итак, удалим из второй части файла все подразделы кроме четырех, два из которых относятся к одной точке респавна, а два — к другой. Иными словами, каждой точке соответствует два подраздела (без любого из них пункт не будет функционировать). Комментарий к первому из них начинается с сочетания SpawnPointTemplate , ко второму — просто с SpawnPoint. Во втором подразделе задаются координаты точки респавна (показатель Object.absolutePosition ) и направление, в котором она будет повернута ( Object.rotation ).

Кстати, о координатах. Одной из оставшихся точек, редактируя показатель Object.absolutePosition , присвоим координаты другой (той, что находится подальше от финиша), а потом чуть скорректируем в полученном значении первый или третий компонент, уменьшив или увеличив его на 5—10 единиц. Кроме того, гонщики должны находиться на одной линии. Для этого необходимо, чтобы первая или третья координата одной из них совпадала с соответствующей координатой другой.

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

Для карты Dalian Plant точкам старта вполне подойдут следующие координаты: -229.000/153.296/-255.000 — для одной из них и -222.000/153.296/-255.000 — для другой. При таких значениях участники заезда будут равноудалены от финиша. Помимо этого желательно развернуть гонщиков лицом к финишу. Для этого необходимо отрегулировать настройку Object.rotation , которой вы в обоих случаях должны прописать следующее значение: 0/0/0. Если же вы работаете не с Dalian Plant, оптимальное значение этого параметра может быть иным. Оно подбирается экспериментальным путем (в нашем случае менять следует только первое число). Но значение в любом случае должно быть одинаковым в двух отобранных ранее подразделах.

На этом операции со стартовыми точками не заканчиваются. В первом подразделе, соответствующем любой точке респавна, наличествует характеристика ObjectTemplate.setControlPointId. Она задает идентификационный номер контрольной точки, к которой “привязан” данный пункт респавна. Посредством этой связи определяется, какой нации принадлежит точка “рождения” на момент начала игры. Ведь контрольный пункт, в свою очередь, может быть собственностью одной из противоборствующих сторон. Он может быть и нейтральным, но тогда “привязывать” к нему точки старта не имеет смысла, поскольку последние попросту не будут работать.

Изменим настройку ObjectTemplate.setControlPointId для отправных пунктов следующим образом. Одному из них пропишите значение одноименного атрибута из подраздела третьей части файла, в котором прописана контрольная точка, принадлежащая первой команде (в этом подразделе есть строка ObjectTemplate.team 1 ). Другому — значение того же параметра, но из подраздела, отведенного под контрольный пункт второй команды (здесь имеется строчка ObjectTemplate.team 2 ).

В случае с Dalian Plant поставьте в значения параметров ObjectTemplate.setControlPointId , принадлежащих точкам “рождения” mainentrance_7 и mainentrance_10 , числа 501 (соответствует контрольному пункту powerplant ) и 502 (контрольная точка constructionsite ) соответственно.

Средства передвижения

Следующий этап в создании трассы — расстановка транспортных средств. Мы поставим их совсем близко к точкам старта. Так, чтобы игроку сразу после “рождения” оставалось только сделать пару шагов по направлению к своей машине и нажать клавишу E. После чего заезд начнется.

Все имеющиеся на карте средства передвижения прописаны в первой части файла ( Object Spawner ). В заезде будут участвовать два гонщика — по одному на нацию. Поэтому и машин (а соответственно — и подразделов в каждом блоке данной части файла) должно остаться только две. Это могут быть любые подразделы. Однако удобнее будет пользоваться теми из них, имена которых повторяют названия выбранных ранее точек старта. Например, на карте Dalian Plant логично остановить свой выбор, скажем, на пунктах mainentrance_LJ и mainentrance_AAV.

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

Содержимое двух оставшихся подразделов из первого блока подредактируем так, чтобы оно выглядело следующим образом:

ObjectTemplate.create ObjectSpawner CPNAME_DP_SP16_*

ObjectTemplate.activeSafe ObjectSpawner CPNAME_DP_SP16_*

ObjectTemplate.modifiedByUser esj

ObjectTemplate.isNotSaveable 1

ObjectTemplate.hasMobilePhysics 0

ObjectTemplate.setObjectTemplate Y X

На месте “ * ” указывается название пункта появления машины. На месте Y — команда ( 1 — китайцы или MEC, 2 — американцы), которой изначально предназначается транспортное средство (хотя пользоваться им может и ее соперник), появляющееся в данной точке. Поставьте вместо Y единицу в случае с первой точкой и двойку в случае со второй.

Что касается X , то он должен быть заменен кратким названием интересующей вас машины. Возможные значения X составляют имена подкаталогов \Air (здесь собраны файлы, посвященные воздушным транспортным средствам), \civilian (транспорт мирного населения), \Land (наземные средства передвижения) и \sea (водные) директории \Vehicles архива Objects_server.zip (о нем упоминалось в предыдущем “вскрытии” игрушки). Понятно, что нас в данном случае будут интересовать наземные транспортные средства. Хотя, в принципе, никто не мешает вам сделать гонки на лодках. Но это отдельная тема для разговора.

Лучше всего для гонок подходят армейские джипы: JEEP_FAAV , jep_mec_paratrooper , jep_nanjing , jep_vodnik , JEP_Paratrooper и USJEP_HMMWV. Особенно хороши последние два, первый из которых представляет собой небольшой скоростной джип, а второй — всем известный “Хаммер” (быстрая, надо сказать, тачка, да еще и с толстой броней). Впрочем, можно выбрать и какие-то другие средства передвижения. Скажем, если вы любите экстрим, почему бы не устроить гонки на танках (объект tnk_type98 )? Скорости, правда, будут небольшими. Но это вполне компенсируется стрельбой. А что может сравниться с удовольствием взорвать точным выстрелом уходящего в отрыв соперника?

Теперь подредактируем два оставшихся подраздела из второго блока первой части файла. В них мы произведем следующие изменения. Характеристике Object.rotation мы присвоим то же значение, что мы придали одноименным настройкам, связанным с начальными точками (для Dalian Plant это, напомню, 0/0/0 ). Параметру Object.absolutePosition из первого подраздела придадим значение, близкое (отличающееся примерно на 5—10 единиц по первой координате и где-то на 5 по третьей в любую сторону) к тому, что присвоили одноименной характеристике, относящейся к первой точке старта (часть файла Spawn Points ). В примере с Dalian Plant оно может, например, выглядеть так: -239.000/153.296/-260.000. В значение того же атрибута, но из второго подраздела поместим числа, близкие (по тому же принципу, что и в случае с предыдущим подразделом, но отличающееся от оригинала в другую сторону) к координатам второго начального пункта. Например, для Dalian Plant годится следующий вариант: -212.000/153.296/-260.000.

То же самое (только в данном случае речь идет о точном заимствовании) необходимо проделать и с характеристикой setControlPointId , поменяв ее значение в обоих подразделах второго блока на идентификационный номер соответствующей стартовой точки. Если говорить о Dalian Plant, то в подразделе mainentrance_LJ рядом с показателем setControlPointId должно стоять число 501 , а в mainentrance_AAV502.

Мы расположили автомобили на старте максимально удобно для игроков. Осталось только внести все те изменения, которым мы подвергли сингловую карту, в ее многопользовательский аналог. Для этого достаточно скопировать файл GamePlayObjects.con , который мы правили до этого, поверх находящегося с ним в одном архиве одноименного файла, лежащего в папке с именем вида \GameModes\gpm_cq\N. На месте N здесь указывается размер карты. Нас интересует тот же вариант уровня, что мы корректировали в случае с сингловой картой. В разобранном примере с Dalian Plant это будет подкаталог \16.

Финальные штрихи

Завершающей стадией подготовки гонок является правка файлов Init.con и gpm_cq.py (хранятся в директории < Каталог игры>\mods\bf2\python\game\gamemodes). Первый из них вы найдете в папке интересующего вас уровня — в архиве server.zip. В нем мы произведем ряд изменений, в первую очередь — над параметрами с именем gameLogic.setDefaultNumberOfTicketsEx. Их в файле целых восемь штук. Каждый из них определяет стартовое число очков у той или иной команды. Значение каждого такого атрибута слагается из трех составляющих. Первое число определяет размер карты (по максимальному числу игроков), второе — нацию, к которой относится параметр ( 1 — китайцы или MEC, 2 — американцы), а третье — как раз количество очков.

Поставьте единицу в заключительный компонент значения двух атрибутов, отводящихся под разные команды и в то же время соответствующих именно тому размеру карты, на базе которого вы создавали трассу. Напомню, что в нашем примере с Dalian Plant мы использовали ее наименьшую — на 16 игроков — форму. Так что корректировать мы будем следующие строки, заменив в них число 100 на 1 :

gameLogic.setDefaultNumberOfTicketsEx 16 1 100

gameLogic.setDefaultNumberOfTicketsEx 16 2 100

Теперь противоборствующие стороны в начале игры будут иметь в своем активе по два очка. Два, потому что в файле gpm_cq.py имеется фрагмент кода, в котором начальное число очков увеличивается вдвое. Вот эта строчка:

return int(mapDefaultTickets * (bf2.serverSettings.getTicketRatio() / 100.0))

Ее нужно укоротить до такого вида:

return int(mapDefaultTickets)

В результате у обоих гонщиков останется лишь по очку. Поэтому никому из них не придется стоять на финише, дожидаясь, пока у его оппонента не иссякнет запас драгоценных баллов.

Напоследок выставим число компьютерных гонщиков в файле AIDefault.ai (располагается в каталоге \mods\bf2\Ai ). Чтобы он был один (соответственно количеству противоборствующих сторон), в строке “ aiSettings.setMaxNBots 64 ” исправим число 64 на 1. Кроме того, чтобы изменения вступили в силу, вставим в файл следующую строку: aiSettings.overrideMenuSettings 1. Если же говорить о мультиплеере, то здесь количество гонщиков вы можете выбрать в самой игре в настройках сервера.

* * *

На этом все основные приготовления завершены. Теперь, когда одна трасса готова, хорошо бы сделать еще одну-две (а может — и больше). Это поможет превратить игру в полноценные аркадные автогонки. Хотя мы и так уже имеем весьма интересный и играбельный мод. Единственные его минусы, вытекающие из недостатков самой игры, — слабоватый AI компьютерных игроков (это проявляется в их не слишком-то развитых водительских навыках) и невозможность участия в заезде более чем двух гонщиков.

Впрочем, гонщиков может быть и больше. Но при этом они все равно будут представлять только две команды. А можно и вовсе устроить заезды на танках… Надо лишь проявить немного смекалки.

Комментарии
Чтобы оставить комментарий, Войдите или Зарегистрируйтесь