Основы скриптов объектов в локациях Fable: TLC
Автор статьи: Torionel
Скрипт объекта — это последовательность параметров, которые детально описывают объекты в игровых локациях. Скриптов в каждой локации столько же, сколько и объектов. Скрипты локаций находятся в файлах формата .tng и имеют начало, середину и конец. Важно не путать скрипты объектов в TNG-файлах со скриптами из файла script.bin (в последнем случае речь идёт о других скриптах — тех, которые описывают квесты).
Для начала вы должны узнать об особых идентификаторах — UID'ах. Здесь будет уместно привести цитату моддера LostInGeneral с портала fabletlcmod.com:
"Прежде всего, вы должны знать, что такое UID. Вы будете работать с ними немного. Взгляните на любой TNG-файл, и вы заметите, что у каждого скрипта есть UID. Деревни, маркеры, люди, здания, объекты, так называемые «святые участки» (holy sites) – у всего есть UID. Считайте, что это своего рода идентификационный номер каждого скрипта: он должен быть уникальным, ведь он действительно большой, этот UID, не так ли?".
Теперь пройдемся по самому скрипту, начиная с первой строки:
- NewThing AICreature; — если стоит такое, значит, это скрипт NPC.
- NewThing Marker; — с этого начинается скрипт маркера, которые нужны для самых разных целей;
- NewThing Building; — какая-либо постройка, скажем, дом;
- NewThing Village; — скрипт, формально "создающий" в какой-либо локации поселение;
- NewThing Object; — естественно, что с этой строки начинается скрипт какого-либо объекта в более привычном смысле.
Если вы хотите создать объект в локации (заспаунить, spawn) не через визуальный редактор Chocolate Box (CBox), а по-старинке (вручную, через блокнот или Notepad++), то начать скрипт нужно с одной из этих строк — в соответствии с тем, что вы собираетесь создать.
Идём дальше.
- Player 1; — самое большое значение, которое тут может быть, это 4. Пока это нам не нужно.
- UID xxxxxxxxxxxxxxxxxxxx; — об этом уже говорилось выше.
- DefinitionType "BLABLABLA_BLABLABLA"; — объект из раздела OBJECT или существо из раздела CREATURE в файле game.bin.
Пример с бочонком: DefinitionType "OBJECT_BARREL_BREAKABLE". Пример с ассассином: DefinitionType "CREATURE_ASSASSIN".
- ScriptName NULL;
- ScriptData "NULL"; — если вы не занимаетесь созданием в локации барда либо телохранителя, то оставьте в обеих строках NULL.
- ThingGamePersistent TRUE;
- ThingLevelPersistent TRUE; — объясним на примере торговца. Если значение в этих полях установлено в TRUE, то если вы купите у этого торговца вещь, она у него уже не появится после повторного входа в локацию. Если значением будет FALSE, то наоборот.
После этого идут строки с координатами объекта:
- StartCTCPhysicsNavigator; — начало этого самого скрипта, если вы создаете в локации NPC;
- если создаете объект, то должно быть StartCTCPhysicsStandard;
- PositionX 19.37793; — эти строки определяют позицию вашего объекта или NPC в .tng-файле.
- PositionY 32.345947;
- PositionZ 100.210526;
- RHSetForwardX -0.2222; — скорее всего, вам не придется изменять эту строку.
- RHSetForwardY 0.974978; — обратите внимание, с помощью изменения значения в этой строке можно вертеть объект (уменьшение значения — по часовой стрелке, увеличение — соответственно, против часовой стрелки).
- RHSetForwardZ 0.0; — не понадобится.
- RHSetUpX -0.000583; — кажется, эти строчки отвечают за наклон объекта.
- RHSetUpY -0.000133;
- RHSetUpZ 0.999994;
- EndCTCPhysicsNavigator; — конец скрипта расположения объекта.
Эта часть скрипта решает, сможем ли мы "выделять" объект в игре:
- StartCTCTargeted; — начало данной части скрипта.
- Targetable TRUE; — делает объект выделяемым. Всегда ставьте 'TRUE' для NPC.
- EndCTCTargeted; — конец.
- StartCTCTalk; — начало части скрипта NPC, отвечающей за разговор с какими-либо командами. Вам вряд-ли понадобится изменять это, когда вы будете писать скрипт для создания в локации своего NPC.
- EndCTCTalk; — конец данной части скрипта.
- StartCTCEditor; — начало части скрипта, которая имеет дело с редактором (чтобы лучше понять, о чем речь, загрузите в CBox любую локацию, выделите любой объект и нажмите на CTCEditor). Единственная команда, которую тут возможно вписать — должен ли объект находиться на одном месте. Вряд ли вам это понадобится.
- EndCTCEditor; — конец данной части скрипта.
- StartCTCVillageMember; — часть скрипта, которая определяет, к какой деревне принадлежит NPC.
- VillageUID xxxxxxxxxxxxxxxxxxxx; — UID деревни. Если задано значение 0, NPC не является членом какой-либо деревни.
- EndCTCVillageMember; — конец данной части скрипта.
- StartCTCContainerRewardHero; — начало "контейнерного" скрипта. Если вы заспаунили что-либо, куда можно засунуть вещи, скажем, разбиваемый бочонок, то можно вставить туда эту часть скрипта. Она должна иметь следующий формат:
|
StartCTCContainerRewardHero; |
Важно: для сундуков такая схема не сработает.
- EndCTCContainerRewardHero; — конец данной части скрипта.
Больше интересного о Fable — в