Здравствуйте! Первый раз, так что не бейте))) Создание дверей стандартных (не вращающихся), я как многие делают, разобью на пошаговые блоки, сразу предупреждаю, надо будет долго терпеть прежде чем всё заработает.
Шаг 1: Описание программных блоков в ".ini", поможет ориентироваться в просторах файла и даст первые намёки на логику взаимодействия программных блоков.
Шаг 2: Здесь я разбиваю на подшаги "а", "б", "в" и т.п, и дам самое основное, что бы дверь вообще работала хотя бы.
Шаг 3: Добавление эффектов "Gib" (Гибы) - картинки появляющиеся после уничтожения двери или мотора, эффект разрушения.
...
ШАГ 1: Описание прораммных блоков в ".ini":
(Буду лишь по одному экземпляру показывать... всё идёт в правильной последовательности, можно в один ".ini" файл всё бросать)Для сравнения можете посмотреть файл "Cortex Command build 23\Base.rte\Actors\Doors\Doors.ini", или прикреплённый файл "All.rte".
{Внимание!!! Игра по каким-то причинам иногда не хочет принимать ".ini" файлы с русским описаниям, особенно в некоторых местах, например: "PresetName = ALL DoorA // Имя присваемое данному программному блоку, с дверью.", игра выдаст ошибку в этой строчке, так же замечено похожее переодическое поведение с координатмаи. Возможно виной всему раскладка клавиатуры в момент пичатанья "//". По этому советю взять готовый ".ini" файл и менять его без добавления описаний.}
1) Первый программный блок. Определяет значение гиба.(Для манипуляций им в будущем!)
Quote
AddEffect = MOSRotating
PresetName = Door Motor Gib A
// Здесь присваиваем имя данному программному блоку или гибу если хотите (для будущего использования) Mass = 52.75
// Масса создаваемого объекта - гиба. HitsMOs = 1
GetsHitByMOs = 0
SpriteFile = ContentFile
FilePath = ALL.rte/Objects/ALL/Doors/Elements/MotorGibA.bmp // Путь к ".bmp" картинке гиба.
FrameCount = 1
SpriteOffset = Vector
X = -8 // Дополнено - уточнено Mad_Alex: Координаты определяющие центр рисунка, который будет еще и центром тяжести объекта.
Y = -7
AngularVel = 6
AtomGroup = AtomGroup
AutoGenerate = 1
Material = Material
CopyOf = Mangled Metal
Resolution = 4
Depth = 0
DeepCheck = 0
2) Второй программный блок. Определяет значение двери (движущейся его части).
Quote
AddEffect = Attachable
PresetName = ALL DoorA
// Имя присваемое данному программному блоку, с дверью. PinStrength = 10000
Mass = 200
// Масса двери. HitsMOs = 1
GetsHitByMOs = 1
SpriteFile = ContentFile
FilePath = ALL.rte/Objects/ALL/Doors/Elements/SlideShortA.bmp // Путь к ".bmp" картинке двери.
FrameCount = 1
SpriteOffset = Vector
X = 0 // Дополнено - уточнено Mad_Alex: Координаты определяющие центр рисунка, который будет еще и центром тяжести объекта.
Y = 0
EntryWound = AEmitter
CopyOf = Dent Metal Light
ExitWound = AEmitter
CopyOf = Dent Metal Light
AngularVel = 0
AtomGroup = AtomGroup
AutoGenerate = 1
Material = Material
CopyOf = Door Metal
Resolution = 4
Depth = 0
DeepGroup = AtomGroup
AutoGenerate = 1
Material = Material
CopyOf = Door Metal
Resolution = 6
Depth = 4
DeepCheck = 1
JointStrength = 300
JointStiffness = 0.5
BreakWound = AEmitter
CopyOf = Wound Bone Break
JointOffset = Vector
X = 0
Y = 0
DrawAfterParent = 1
GibImpulseLimit = 7500 // Это значение определяет какая сила воздействия начинает наносить вред двери..
GibWoundLimit = 75 // Это количество жизней, двери.
// GibSound = Sound
// CopyOf = Bone Crack
AddGib = Gib // Этот программный блок прикрепляет гибы к двери.
GibParticle = MOSRotating
CopyOf = Door Base Gib // Название присвоенное гибу в программном блоке 1.
Offset = Vector
X = 0
Y = 7
MinVelocity = 15
3) Третий программный блок. Определяет значения мотора.
Quote
AddEffect = ADoor
PresetName = ALL MotorA
// Имя присваемое данному программному блоку, с мотором. Mass = 117.72
// Масса мотора. HitsMOs = 0
GetsHitByMOs = 1
SpriteFile = ContentFile
FilePath = ALL.rte/Objects/ALL/Doors/Elements/MotorA.bmp //Путь к ".bmp" картинке мотора.
FrameCount = 4
SpriteOffset = Vector
X = 0 // Дополнено - уточнено Mad_Alex: Координаты определяющие центр рисунка, который будет еще и центром тяжести объекта.
Y = 0
AngularVel = 6
AtomGroup = AtomGroup
AutoGenerate = 1
Material = Material
CopyOf = Military Stuff
Resolution = 4
Depth = 0
DeepCheck = 0
GibImpulseLimit = 5000 // Это значение определяет какая сила воздействия начинает наносить вред мотору.
GibWoundLimit = 30 // Это количество жизней мотора.
// Сюда также можно прикрепить гибы (смотреть конец второго программного блока)
4) Четвёртый программный блок. Он соединяет мотор и дверь (привязывает дверь к мотору).
Quote
AddActor = ADoor
CopyOf = ALL MotorA // Название присвоенное программному блоку отвечающему за мотор.
PresetName = ALL SistemA // Название присваемое программному блоку в котором совместили дверь и мтор.
PinStrength = 10000
SpriteAnimMode = 5
SpriteAnimDuration = 150 // Скорость анимации мотора.
EntryWound = AEmitter
CopyOf = Leaking Machinery
ExitWound = AEmitter
CopyOf = Leaking Machinery
Status = 0
Health = 100
Team = 0
CharHeight = 40
Door = Attachable
CopyOf = ALL DoorA //Название присвоенное программному блоку отвечающему за дверь.
OpenOffset = Vector
X = -29 // Координаты двери в открытом состоянии, относительно места установки мотора, а не его рисунка. (В пикселях)
Y = 0
ClosedOffset = Vector
X = -29 // Координаты двери в закрытом состоянии, относительно места установки мотора, а не его рисунка. (В пикселях)
Y = 24
OpenClosedAngle = Matrix
AngleDegrees = 0 //Поворот ".bmp" картинки двери. (В градусах)
DoorMoveTime = 750 //Время закрытия-открытия двери(ей).
// DoorOpenSound
ClosedByDefault = 1
ResetDefaultDelay = 2000 // Через сколько после установки в игру закроются двери, как это бывает обычно у всех.
SensorInterval = 100
AddSensor = Sensor
StartOffset = Vector
X = 0 // Координаты пройдя в которых дверь откроется, относительно места установки мотора, а не его рисунка. (В пикселях)
Y = 28 //Удивительно, но со знаками (+ и -) какая-то белиберда, это вы уж сами тестируйте, но похоже здесь надо ставить знак наоборот. Что то вроде, того что не от мотора считается, а от точки считается где мотор находится, но мотор всё равно остаётся на месте и точка оказывается там где нам надо.
SensorRay = Vector
X = -55 // Точка координат до которой тянется линия от предыдущей точки координат (смотреть выше) войдя в которую откроются двери. (В пикселях, относительно предыдужей точки координат)
Y = 0
SkipPixels = 6 // Дополнено - уточнено Mad_Alex: Чем меньше значение параметра SkipPixels тем плотнее луч соединяющий координаты "StartOffset = Vector" и "SensorRay = Vector", детальнее проверка наличия актора в луче и больше он кушает быстродействие
5) Пятый программный блок. Добавляет в СС объект и определяет местонахождение моторов.
Quote
AddTerrainObject = TerrainObject // Добавляем объект.
PresetName = DoorT2 // Название объекта которое будет отображаться в игре.
AddToGroup = ALL (Doors) // Группа в которой будет находиться объект в игре.
GoldCost = 150 // Цена объекта.
FGColorFile = ContentFile // Ниже пути по которым игра найдёт нужные рисунки для создания объекта.
Path = ALL.rte/Objects/ALL/Doors/DoorT2FG.bmp
MaterialFile = ContentFile
Path = ALL.rte/Objects/ALL/Doors/DoorT2Mat.bmp
BGColorFile = ContentFile
Path = ALL.rte/Objects/ALL/Doors/DoorT2BG.bmp
AddChildObject = SOPlacer
PlacedObject = ADoor // Строка отвечающая з создание дверей в объекте.
CopyOf = ALL SistemA // Имя присвоенное программному блоку в котором совместили дверь и мтор.
Offset = Vector
X = 21 // Координаты мотора, относительно центра рисунка. (В пикселях)
Y = -41
AddChildObject = SOPlacer // Это блок второго мотора.
PlacedObject = ADoor
CopyOf = ALL SistemA // Имя присвоенное программному блоку в котором совместили дверь и мтор.
Offset = Vector
X = 21 // Координаты мотора, относительно центра рисунка. (В пикселях)
Y = 41
HFlipped = 1 // Зеркализация, делает его (мотор) наоборот, как отражение тому, что должно было быть без этой команды.
Rotation = Matrix
AngleDegrees = 180 // Поворот рисунка двери. (В градусах)
...
Шаг 2:
А) Создаём дверь, мотор и объект в котором всё это будет находиться.
Б) Создаём ".ini" файл и добавляем туда блок номер 2, но лучше из СС , а не отсюда!
В строке "PresetName = ***" вместо звёздочек пишем имя которым вы хотите назвать этот программный блок.
В строке"FilePath = ###" вместо решёток пишем путь к файлу (".bmp" картинке) вашей двери.[/color]
В) Создаём прораммный блок номер 3 и проделываем те же манипуляции!
Г) Создаём прораммный блок номер 4.
В строке"CopyOf = ###" Вместо решёток пишем как мы назвали программный блок номер 3 (мотор).
В строке"PresetName =***" вместо звёздочек пишем как мы назвали программный блок 2 (дверь).
Д) Создаём программный блок номер 5.
В строке "PresetName = $$$" Вместо долларов пишем как мы назовём наш модуль в СС (в игре).
В строке"AddToGroup = %%%" Вместо процентов пишем в какой группе будет название нашего модуля.
В трёх строках с названиями "Path = ^^^" Вместо вершинок пишем пути к трём разным bmp картинкам модуля на которому будут размещены мотр с дверью.
В строке "CopyOf = @@@" Вместо Собак пишем как мы назвали программный блок номер 4 (слияние двери с мотором).
И указываем координаты размещения моторов относительно центра рисунка модуля. В
"X" и "Y".
Е) После всех манипуляций и установки мотора в нужном месте возвращаемся к прораммному блоку 4 и химичим.
Quote
AddSensor = Sensor
StartOffset = Vector
X = 0 // Координаты пройдя в которых дверь откроется, относительно места установки мотора, а не его рисунка. (В пикселях)
Y = 28 //Удивительно, но со знаками (+ и -) какая-то белиберда, это вы уж сами тестируйте, но похоже здесь надо ставить знак наоборот. Что то вроде, того что не от мотора считается, а от точки считается где мотор находится, но мотор всё равно остаётся на месте и точка оказывается там где нам надо.
SensorRay = Vector
X = -55 // Точка координат до которой тянется линия от предыдущей точки координат (смотреть выше) войдя в которую откроются двери. (В пикселях, относительно предыдужей точки координат)
Y = 0
SkipPixels = 6
Остальные манипуляции проводите пользуясь материалами Шаг 1 для обеспечения правильного места отображения элементов.
...
Шаг 3:
Если вы разобрались с расположением мотора и дверьми , и всё рабтает, можно приступать к освоению гибов.
Заходим в наш злополучный ".ini", хотя для кого как))) И добавляем первый программный блок (ставим перед вторым и желательно оставить пустую строку между блоками. Для сравения всё так же смотрите файл "Cortex Command build 23\Base.rte\Actors\Doors\Doors.ini", ну или прикреплённый файл "All.rte")
В строке "PresetName = ***" вместо звёздочек пишем имя которым вы хотите назвать этот программный блок.
В строке "FilePath = ###" вместо решёток пишем путь к файлу (".bmp" картинке) вашему гибу.
В зависимости от того для чего этот гиб (для мотора или двери) мы в 2 (дверь) или 3 (мотор) программном блоке вставляем некое дополнение
Quote
AddGib = Gib
GibParticle = MOSRotating
CopyOf = *** // Вместо звёздочек пишем название присвоенное гибу в программном блоке 1 (Гибы).
Offset = Vector
X = 0 // Координаты по которым размещается гиб относительно центра рисунка двери (Или мотора если вы вставили это в программный блок 3)
Y = 7
MinVelocity = 15
Если всё сделано правильно , вы увидите как отваливаются куски от вашей двери когда она исчерпала свой лимит жизни))) Удачи в модостроении!!!
Всё равно мне до мода полноценного далеко, так что выкладываю две двери после создания которых я и написал эту статью, как пример на котором можно поэкспериментировать: