[ Обновленные темы · Новые сообщения · Участники · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Моддинг » 6.1. Остальные уроки » Формат файла мода W4TweakGen (Описание с примерами)
Формат файла мода W4TweakGen
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
Формат файла мода.

Файл мода - обычный xml файл. Корневой элемент - тэг Mod. Другими словами любой файл мода имеет следующий вид:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="имя базового xml файла">
     <!-- Тут содержимое -->
</Mod>

1. Тэг Mod имеет один обязательный атрибут BaseFile - относительный или абсолютный путь к базовому файлу.
Базовый файл - стандартный xml файл из игры. К примеру, C:/Program Files/Worms/data/Tweak/Local.xml
Пример:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="C:/Program Files/Worms/data/Tweak/Local.xml">
     <!-- Тут содержимое -->
</Mod>

В W4TweakGen для стандартных файлов выделена папка base, а для файлов модов samples,
поэтому, если в папке base лежит копия стандартного файла, а файл мода находится в samples,
то в атрибуте BaseFile можно написать относительный путь ../base/Local.xml
То есть это будет выглядеть так:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/Local.xml">
     <!-- Тут содержимое -->
</Mod>

Внутри тэга Mod разрешены следующие тэги:
Remove
Int
Uint
Float
String
Color
Vector
Любой другой тэг.

1.1. Тэг Remove нужен для удаления из базового файла каких либо контейнеров.
Под удалением понимается удаление ссылки на контейнер в разделе XDataBank и самого контейнера из xomObjects.
Тэг Remove не имеет атрибутов.
Внутри тэга Remove пишется id контейнера, который надо удалить.
К примеру, чтобы удалить из базового файла Tweak.xml контейнер с id='Ninja.NumShoots'.

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/Tweak.xml">
     <Remove>Ninja.NumShoots</Remove>
</Mod>


Можно указать любой id. Если это id контейнера XContainerResourceDetails, то удаляется и тот контейнер, на который ссылается XContainerResourceDetails.
К примеру, вот фрагмент файла Local.xml:
Code
...
<FlagDataContainer id='Flag.OldWorm-0'>
   <TextResource>FETXT.Flag.OldWorm</TextResource>
   <TargaName>Custom OldWorm</TargaName>
</FlagDataContainer>
<XContainerResourceDetails id='Flag.Pakistan'>
   <Value href='Flag.Pakistan-0'/>
   <Name>Flag.Pakistan</Name>
   <Flags>80</Flags>
</XContainerResourceDetails>
<FlagDataContainer id='Flag.Pakistan-0'>
   <TextResource>FETXT.Flag.Pakistan</TextResource>
   <TargaName>Pakistan</TargaName>
</FlagDataContainer>
<XContainerResourceDetails id='Flag.Poland'>
   <Value href='Flag.Poland-0'/>
   <Name>Flag.Poland</Name>
   <Flags>80</Flags>
</XContainerResourceDetails>
...

Если написать следующий мод:
Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/Local.xml">
     <Remove>Flag.Pakistan</Remove>  
</Mod>

то будут удалены контейнеры <XContainerResourceDetails id='Flag.Pakistan'> и <FlagDataContainer id='Flag.Pakistan-0'>
Получим такой результат:
Code
...
<FlagDataContainer id='Flag.OldWorm-0'>
   <TextResource>FETXT.Flag.OldWorm</TextResource>
   <TargaName>Custom OldWorm</TargaName>
</FlagDataContainer>
<XContainerResourceDetails id='Flag.Poland'>
   <Value href='Flag.Poland-0'/>
   <Name>Flag.Poland</Name>
   <Flags>80</Flags>
</XContainerResourceDetails>
...

Если же написать
Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/Local.xml">
     <Remove>Flag.Pakistan-0</Remove>  
</Mod>

то будет удалён только один контейнер <FlagDataContainer id='Flag.Pakistan-0'>Получим такой результат:
Code
...
<FlagDataContainer id='Flag.OldWorm-0'>
   <TextResource>FETXT.Flag.OldWorm</TextResource>
   <TargaName>Custom OldWorm</TargaName>
</FlagDataContainer>
<XContainerResourceDetails id='Flag.Pakistan'>
   <Value href='Flag.Pakistan-0'/>
   <Name>Flag.Pakistan</Name>
   <Flags>80</Flags>
</XContainerResourceDetails>
<XContainerResourceDetails id='Flag.Poland'>
   <Value href='Flag.Poland-0'/>
   <Name>Flag.Poland</Name>
   <Flags>80</Flags>
</XContainerResourceDetails>
...

Действие тэга Remove распространяется только на базовый файл! Если вы создаёте новый контейнер,
и пытаетесь его удалить, то ничего не выйдет.
1.2. Тэги Int,Uint,Float,String,Vector и Color
Предназначены для создания тех типов данных, которые не используют XContainerResourceDetails.
У каждого из этих тэгов имеется обязательный атрибут id. Он указывает, какой id должен иметь
созданный контейнер.

Внутри тэгов Int,Uint,Float и String просто пишется значение:

Code
<Int id="the.integer">-356</Int>  
<Uint id="unsigned.number">55</Uint>  
<Float id="some.float">0.3</Float>  
<String id="txtGerich">Герыч</String>

Vector и Color немного посложнее:

Code
<Vector id="pos">  
     <x>3</x>  
     <y>20</y>  
     <z>0</z>  
</Vector>

Code
<Color id="transparentred">  
     <r>255</r>  
     <g>0</g>  
     <b>0</b>  
     <a>128</a>  
</Color>

Внутренние тэги у тэгов Vector и Color необязательные, по умолчанию принимаются равными 0.

Пример. Такой мод:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/Local.xml">
    <String id="txtGerich">Герыч</String>
</Mod>

Добавит в базовый файл Local.xml в раздел XDataBank следующую строчку:
Code
...
<StringResources href='txtGerich'/>
...

а в конце xomObjects
Code
...
<XStringResourceDetails id='txtGerich'>
     <Name>'txtGerich'</Name>
     <Value>Герыч</Value>
     <Flags>80</Flags>
</XStringResourceDetails>
...

Важная особенность: если при создании контейнера вы указываете id контейнера из базового файла,
то он будет заменён на ваш контейнер.
К примеру следующий мод просто изменит значение Jetpack.InitFuel с 7500 на 30000

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/Tweak.xml">
     <Int id="Jetpack.InitFuel">30000</Int>
</Mod>

1.3. Остальные тэги.
Если написать любой другой тэг внутри тэга Mod, то он воспринимается как новый контейнер,
который надо добавить в базовый файл.
Обязательным атрибутом является id.

Пример:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/Local.xml">
     <FlagDataContainer id='Flag.Gerich'>  
         <TextResource>txtGerich</TextResource>  
         <TargaName>Gerich</TargaName>  
     </FlagDataContainer>
</Mod>

Такой мод добавит в результате строчку в XDataBank:
Code
...
<ContainerResources href='Flag.Gerich'/>
...

и создаст 2 контейнера: сам FlagDataContainer и XContainerResourceDetails, ссылающийся на него.
В итоге получим:
Code
...
<XContainerResourceDetails id='Flag.Gerich'>  
     <Value href='Flag.Gerich-0'/>  
     <Name>Flag.Gerich</Name>  
     <Flags>80</Flags>  
</XContainerResourceDetails>  
<FlagDataContainer id='Flag.Gerich-0'>  
     <TextResource>txtGerich</TextResource>  
     <TargaName>Gerich</TargaName>  
</FlagDataContainer>
...

Иногда не надо добавлять ссылку в XDataBank и не надо делать XContainerResourceDetails.
Для этого надо предназначен атрибут header. Если он равен 'no', то не будет
генерироваться заголовок и XContainerResourceDetails:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/Local.xml">
     <FlagDataContainer id='Flag.Gerich' header='no'>  
         <TextResource>txtGerich</TextResource>  
         <TargaName>Gerich</TargaName>  
     </FlagDataContainer>
</Mod>

В результате получим:
Code
...
<FlagDataContainer id='Flag.Gerich'>  
     <TextResource>txtGerich</TextResource>  
     <TargaName>Gerich</TargaName>  
</FlagDataContainer>
...

Для собственных тэгов действует то же правило, что и для Int, Uint и т.д:
если при создании контейнера вы указываете id контейнера из базового файла,
то он будет заменён на ваш контейнер.

Часто 2 однотипных контейнера отличаются одним-двумя тэгами.
Если каждый раз копировать содержимое тэга полностью можно устать, запутаться и ошибиться.
Для этого контейнеру можно задать атрибут base. Он указывает id того элемента, на основе которого будет
будет создан новый контейнер.
Пример:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/Local.xml">
     <FlagDataContainer id='Flag.Gerich' base='Flag.RussianFederation'/>
</Mod>

Тут мы создаём новый контейнер - копию контейнера Flag.RussianFederation, но с другим id. При этом контейнер Flag.RussianFederation удалён/заменён или изменён не будет.

Теперь изменим полученную копию:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/Local.xml">
     <FlagDataContainer id='Flag.Gerich' base='Flag.RussianFederation'>
         <TextResource>txtGerich</TextResource>
     </FlagDataContainer>
</Mod>

Этот код изменит копию, заменив значение тэга TextResource, то есть у этого флага будет та же картинка, но другое название.

Рассмотрим ещё несколько задач, решаемых с помощью W4TweakGen, на примере работы с контейнерами эффектов в файле PartTwk.xml.

Code
...
<XContainerResourceDetails id='WXP_MeshBang_HotCoreLarge'>
   <Value href='WXP_MeshBang_HotCoreLarge-0'/>
   <Name>WXP_MeshBang_HotCoreLarge</Name>
   <Flags>81</Flags>
</XContainerResourceDetails>
<ParticleEmitterContainer id='WXP_MeshBang_HotCoreLarge-0'>
   <Comment></Comment>
   <EmitterType>0</EmitterType>
   <SpriteSet>Particle.WXSprite3</SpriteSet>
   <MeshAnimNodeName></MeshAnimNodeName>
   <EmitterAcceleration x='0' y='0' z='0' />
   <EmitterAccelerationRandomise x='0' y='0' z='0' />
   <EmitterIsAttachedToLand>false</EmitterIsAttachedToLand>
   <EmitterIsOfInterest>false</EmitterIsOfInterest>
   <EmitterIsLaunchedFromWeapon>false</EmitterIsLaunchedFromWeapon>
   <EmitterLifeTime>1</EmitterLifeTime>
   <EmitterLifeTimeRandomise>0</EmitterLifeTimeRandomise>
   <EmitterMaxParticles>2</EmitterMaxParticles>
   <EmitterNumCollide>0</EmitterNumCollide>
   <EmitterNumSpawn>1</EmitterNumSpawn>
   <EmitterNumSpawnRadnomise>0</EmitterNumSpawnRadnomise>
   <EmitterOriginOffset x='0' y='0' z='0' />
   <EmitterOriginRandomise x='0' y='0' z='0' />
   <EmitterParticleExpireFX></EmitterParticleExpireFX>
   <EmitterParticleFX></EmitterParticleFX>
   <EmitterSameDirectionAsWorm>false</EmitterSameDirectionAsWorm>
   <EmitterSoundFX></EmitterSoundFX>
   <EmitterSoundFXVolume>1</EmitterSoundFXVolume>
   <EmitterSpawnFreq>10</EmitterSpawnFreq>
   <EmitterSpawnFreqRansomise>0</EmitterSpawnFreqRansomise>
   <EmitterSpawnSizeVelocity x='0' y='0' />
   <EmitterStartDelay>250</EmitterStartDelay>
   <EmitterVelocity x='0' y='0' z='0' />
   <EmitterVelocityRandomise x='0' y='0' z='0' />
   <ParticleAcceleration x='0' y='-1' z='0' />
   <ParticleAccelerationRandomise x='0' y='0' z='0' />
   <ParticleAlpha>1</ParticleAlpha>
   <ParticleAlphaFadeIn>5</ParticleAlphaFadeIn>
   <ParticleAlphaVelocity>-1</ParticleAlphaVelocity>
   <ParticleAlphaVelocityDelay>50</ParticleAlphaVelocityDelay>
   <ParticleAlternateAccelerationN>0</ParticleAlternateAccelerationN>
   <ParticleAlternateAccelerationS>0</ParticleAlternateAccelerationS>
   <ParticleAnimationFrame>0</ParticleAnimationFrame>
   <ParticleAnimationFrameRandomise>0</ParticleAnimationFrameRandomise>
   <ParticleAnimationSpeed>0</ParticleAnimationSpeed>
   <ParticleAnimationSpeedRandomize>0</ParticleAnimationSpeedRandomize>
   <ParticleAttractor x='0' y='0' z='0' />
   <ParticleAttractorRandomise x='0' y='0' z='0' />
   <ParticleAttractorIsActive>false</ParticleAttractorIsActive>
   <ParticleCanEnterWater>true</ParticleCanEnterWater>
   <ParticleCollisionFreq>0</ParticleCollisionFreq>
   <ParticleCollisionImmuneTime>0</ParticleCollisionImmuneTime>
   <ParticleCollisionMinAlpha>0</ParticleCollisionMinAlpha>
   <ParticleCollisonRadius>0</ParticleCollisonRadius>
   <ParticleCollisonRadiusOffset x='0' y='0' z='0' />
   <ParticleCollisonRadiusVelocity>0</ParticleCollisonRadiusVelocity>
   <ParticleCollisionShowDebug>false</ParticleCollisionShowDebug>
   <ParticleCollisionWormDamageMagnitude>0</ParticleCollisionWormDamageMagnitude>
   <ParticleCollisionWormImpulseMagnitude>0</ParticleCollisionWormImpulseMagnitude>
   <ParticleCollisionWormImpulseYMagnitude>0</ParticleCollisionWormImpulseYMagnitude>
   <ParticleCollisionWormPoisonMagnitude>0</ParticleCollisionWormPoisonMagnitude>
   <ParticleCollisionWormType>0</ParticleCollisionWormType>
   <ParticleColor r='1' g='1' b='1' />
   <ParticleColor r='1' g='0.8' b='0' />
   <ParticleColor r='1' g='0' b='0' />
   <ParticleColorBand>0</ParticleColorBand>
   <ParticleColorBand>0.2</ParticleColorBand>
   <ParticleColorBand>0.5</ParticleColorBand>
   <ParticleColorBand>1</ParticleColorBand>
   <ParticleExpireShake>false</ParticleExpireShake>
   <ParticleExpireShakeLength>0</ParticleExpireShakeLength>
   <ParticleExpireShakeMagnitude>0</ParticleExpireShakeMagnitude>
   <ParticleIsAlternateAcceleration>false</ParticleIsAlternateAcceleration>
   <ParticleIsEffectedByWind>false</ParticleIsEffectedByWind>
   <ParticleIsSpiral>false</ParticleIsSpiral>
   <ParticleIsUnderWaterEffect>false</ParticleIsUnderWaterEffect>
   <ParticleLandCollideType>1</ParticleLandCollideType>
   <ParticleLife>1600</ParticleLife>
   <ParticleLifeRandomise>800</ParticleLifeRandomise>
   <ParticleMass>0</ParticleMass>
   <ParticleNumColors>2</ParticleNumColors>
   <ParticleNumFrames>0</ParticleNumFrames>
   <ParticleOrientation x='0' y='0' z='0' />
   <ParticleOrientationRandomise x='0' y='0' z='0' />
   <ParticleOrientationVelocity x='0' y='0' z='0' />
   <ParticleOrientationVelocityRandomise x='0' y='0' z='5' />
   <ParticleSize x='65' y='65' />
   <ParticleSizeOriginIsCenterPoint>false</ParticleSizeOriginIsCenterPoint>
   <ParticleSizeRandomise>0</ParticleSizeRandomise>
   <ParticleSizeVelocity x='1' y='1' />
   <ParticleSizeVelocityRandomise x='0.4' y='0.4' />
   <ParticleSizeVelocityDelay>0</ParticleSizeVelocityDelay>
   <ParticleSizeVelocityDelayRandomise>0</ParticleSizeVelocityDelayRandomise>
   <ParticleFinalSizeScale x='0' y='0' />
   <ParticleFinalSizeScaleRandomise>0</ParticleFinalSizeScaleRandomise>
   <ParticleSizeFadeIn>0</ParticleSizeFadeIn>
   <ParticleSizeFadeInRandomize>0</ParticleSizeFadeInRandomize>
   <ParticleSizeFadeInDelay>0</ParticleSizeFadeInDelay>
   <ParticleSizeFadeInDelayRandomize>0</ParticleSizeFadeInDelayRandomize>
   <ParticleRenderScene>1</ParticleRenderScene>
   <ParticleSpiralRadius>0</ParticleSpiralRadius>
   <ParticleSpiralRadiusRandomise>0</ParticleSpiralRadiusRandomise>
   <ParticleSpiralRadiusVelocity>0</ParticleSpiralRadiusVelocity>
   <ParticleSpiralRadiusVelocityRandomise>0</ParticleSpiralRadiusVelocityRandomise>
   <ParticleSpiralRadiusSizeVelocity>0</ParticleSpiralRadiusSizeVelocity>
   <ParticleVelocity x='0' y='0' z='0' />
   <ParticleVelocityRandomise x='0.02' y='0' z='0.02' />
   <ParticleVelocityIsNormalised>false</ParticleVelocityIsNormalised>
</ParticleEmitterContainer>
...

Как видите контейнер ужасно большой и с ним очень неудобно возиться, поэтому, создавая свой эффект,
хочется не переписывать всё заново, а создать эффект на основе уже существуещего.
Если вы внимательно посмотрите содержимое контейнера, то заметите, что в нём повторяются имена тэгов:
Code
  <ParticleColor r='1' g='1' b='1' />
   <ParticleColor r='1' g='0.8' b='0' />
   <ParticleColor r='1' g='0' b='0' />

и
Code
  <ParticleColorBand>0</ParticleColorBand>
   <ParticleColorBand>0.2</ParticleColorBand>
   <ParticleColorBand>0.5</ParticleColorBand>
   <ParticleColorBand>1</ParticleColorBand>

Поэкспериментируем с этим контейнером.
За основу возьмём такой мод:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/PartTwk.xml">
     <ParticleEmitterContainer id='New.Effect' base='WXP_MeshBang_HotCoreLarge'>
     </ParticleEmitterContainer>
</Mod>

а затем будем его менять.


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
1.3.1. Тэг Remove внутри контейнера созданного на базе другого.
С помощью тэга Remove можно удалять из базового контейнера какие либо элементы
Тэг Remove имеет атрибуты tag, index, from, to, которые в разном сочетании дают разные эффекты

Удаление 5-го по счёту элемента, т.е. <EmitterAcceleration x='0' y='0' z='0' />:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/PartTwk.xml">
     <ParticleEmitterContainer id='New.Effect' base='WXP_MeshBang_HotCoreLarge'>
         <Remove index='5'/>
     </ParticleEmitterContainer>
</Mod>

Удаление 7-го,8-го,9-го,10-го,11-го по счёту элементов:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/PartTwk.xml">
     <ParticleEmitterContainer id='New.Effect' base='WXP_MeshBang_HotCoreLarge'>
         <Remove from='7' to='11'/>
     </ParticleEmitterContainer>
</Mod>

Удаление всех элементов ParticleColor:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/PartTwk.xml">
     <ParticleEmitterContainer id='New.Effect' base='WXP_MeshBang_HotCoreLarge'>
         <Remove tag='ParticleColor'/>
     </ParticleEmitterContainer>
</Mod>

Удаление 2-го элемента ParticleColor:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/PartTwk.xml">
     <ParticleEmitterContainer id='New.Effect' base='WXP_MeshBang_HotCoreLarge'>
         <Remove tag='ParticleColor' index='2'/>
     </ParticleEmitterContainer>
</Mod>

Удаление 2-го, 3-го, 4-го элемента ParticleColorBand:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/PartTwk.xml">
     <ParticleEmitterContainer id='New.Effect' base='WXP_MeshBang_HotCoreLarge'>
         <Remove tag='ParticleColorBand' from='2' to='4'/>
     </ParticleEmitterContainer>
</Mod>

В одном контейнере может быть несколько правил для удаления. Тут удаляются элементы ParticleColor и ParticleColorBand:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/PartTwk.xml">
     <ParticleEmitterContainer id='New.Effect' base='WXP_MeshBang_HotCoreLarge'>
         <Remove tag='ParticleColor' from='2' to='3'/>
         <Remove tag='ParticleColorBand' from='2' to='4'/>
     </ParticleEmitterContainer>
</Mod>

1.3.2. Тэг Append внутри контейнера созданного на базе другого.
Тэг Append просто добавляет своё содержимое в конец базового контейнера.

Тут добавляются 2 совершенно произвольных тэга:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/PartTwk.xml">
     <ParticleEmitterContainer id='New.Effect' base='WXP_MeshBang_HotCoreLarge'>
         <Append>
             <SomeTag>Новый тэг</SomeTag>
             <OtherTag>Другой новый тэг</OtherTag>
         </Append>
     </ParticleEmitterContainer>
</Mod>

1.3.3. Тэг Insert внутри контейнера созданного на базе другого.
Тэг Insert вставляет своё содержимое в заданную базового контейнера.
У тэга Insert есть обязательный атрибут index, который указывает в каком месте вставить содержимое,
и два необязательных before и after, в которых можно указать, перед или после какого элемента(по имени тэга) вставить содержимое.
Если задан before или after, то index определяет номер элемента, среди элементов с тем же именем тэга.
Если есть 2 тэга Insert с одинаковым значением index и без before или after, то они работают так, будто это один тэг Insert

Пример вставки. Вставляет новый элемент ParticleColor в 57-ую позицию(то есть перед первым элементом ParticleColor):

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/PartTwk.xml">
     <ParticleEmitterContainer id='New.Effect' base='WXP_MeshBang_HotCoreLarge'>
         <Insert index='57'>
             <ParticleColor r='0.5' g='0.5' b='1' />
         </Insert>
     </ParticleEmitterContainer>
</Mod>

То же самое проще сделать так:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/PartTwk.xml">
     <ParticleEmitterContainer id='New.Effect' base='WXP_MeshBang_HotCoreLarge'>
         <Insert before='ParticleColor' index='1'>
             <ParticleColor r='0.5' g='0.5' b='1' />
         </Insert>
     </ParticleEmitterContainer>
</Mod>

Если указанный index больше размера контейнера, то Insert работает как Append

2. Всякие фишечки.
2.1. Замены всех элементов и замены по номеру.
Бывает необходимо заменить отдельный элемент среди элементов с одним именем тэга. К примеру, требуется
изменить 3-ий элемент ParticleColor.
Но следующий код изменяет сразу все элементы ParticleColor:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/PartTwk.xml">
     <ParticleEmitterContainer id='New.Effect' base='WXP_MeshBang_HotCoreLarge'>
         <ParticleColor r='0.5' g='0.5' b='1' />
     </ParticleEmitterContainer>
</Mod>

Для изменения только одного, можно указать атрибут index равный номеру элементу среди элементов с таким именем.
Таким образом следующий код меняет только нужный нам элемент.

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/PartTwk.xml">
     <ParticleEmitterContainer id='New.Effect' base='WXP_MeshBang_HotCoreLarge'>
         <ParticleColor index='3' r='0.5' g='0.5' b='1' />
     </ParticleEmitterContainer>
</Mod>

2.2. Атрибут base и include.
Атрибут base может указывать на любой индекс в базовом файле(на XContainerResourceDetails или на сам контейнер),
а также на контейнеры определённые в моде. Примеры:
1) в базовом файле, XContainerResourceDetails:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/PartTwk.xml">
     <ParticleEmitterContainer id='New.Effect' base='WXP_MeshBang_HotCoreLarge'>
     </ParticleEmitterContainer>
</Mod>

2) в базовом файле, сам контейнер:
Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/PartTwk.xml">
     <ParticleEmitterContainer id='New.Effect' base='WXP_MeshBang_HotCoreLarge-0'>
     </ParticleEmitterContainer>
</Mod>

3) в файле мода:
Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/PartTwk.xml">
     <ParticleEmitterContainer id='New.Effect' base='WXP_MeshBang_HotCoreLarge'>
         <ParticleColor index='3' r='0.5' g='0.5' b='1' />
     </ParticleEmitterContainer>
      
     <ParticleEmitterContainer id='Very.New.Effect' base='New.Effect'>
         <ParticleVelocity x='0' y='10' z='0' />
     </ParticleEmitterContainer>
</Mod>

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

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/PartTwk.xml">
     <ParticleEmitterContainer id='New.Effect' base='WXP_MeshBang_HotCoreLarge'>
         <ParticleColor index='3' r='0.5' g='0.5' b='1' />
     </ParticleEmitterContainer>
      
     <ParticleEmitterContainer id='Very.New.Effect1' base='New.Effect'>
         <ParticleVelocity x='0' y='10' z='0' />
     </ParticleEmitterContainer>
      
     <ParticleEmitterContainer id='Very.New.Effect2' base='New.Effect'>
         <ParticleVelocity x='0' y='0' z='10' />
     </ParticleEmitterContainer>
</Mod>

Но иногда базовый контейнер не нужно включать в файл-результат. Для этого служит атрибут include:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/PartTwk.xml">
     <ParticleEmitterContainer id='New.Effect' base='WXP_MeshBang_HotCoreLarge' include='no'>
         <ParticleColor index='3' r='0.5' g='0.5' b='1' />
     </ParticleEmitterContainer>
      
     <ParticleEmitterContainer id='Very.New.Effect1' base='New.Effect'>
         <ParticleVelocity x='0' y='10' z='0' />
     </ParticleEmitterContainer>
      
     <ParticleEmitterContainer id='Very.New.Effect2' base='New.Effect'>
         <ParticleVelocity x='0' y='0' z='10' />
     </ParticleEmitterContainer>
</Mod>

Написав include='no' мы исключаем New.Effect из генерации, но порождённые контейнеры будут сгенерированы.
Атрибут include можно применять к любым контейнерам(в том числе и Int, Uint, Float, String, Vector, Color).

2.3 Замена и base
Очень крутая фишка - при замене контейнера, можно использовать его в качестве базы.
Пример:

Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/Local.xml">
     <WeaponFactoryCollective id='DATA.LockedWeapons-0' base='DATA.LockedWeapons-0' header='no'>
         <Append>
             <Weapons href='newweapon'/>
         </Append>
     </WeaponFactoryCollective>
</Mod>

Этот код элегантно заменяет контейнер DATA.LockedWeapons-0 его копией, но с добавленным новым оружием.

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


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
MarkWarT
Проверенные
Сообщений: 497
Реп: 22
Я не понял с тегом Int. Вот возьмем пример. Твой мод Jetpack.xml выглядит так:
Code
<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/Tweak.xml">
      <Int id="Jetpack.InitFuel">30000</Int>
</Mod>

Тэг Int вроде же добавляет, а не заменяет? В первой версии программы она как раз не заменяла значение, а создавала новый контейнер с тем же именем
Или это уже исправлено?

---АПД---
Ага. Я разобрался. Просто я Jetpack.MaxAltitude в моде указал как Int id, а она оказывается Float id


Trading Unusual Nickname with Perfectly Straight Underlines, serious offers only

Сообщение отредактировал MarkWarT - СР, 13.01.2010, 16:13:59
 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
Да. Имя тэга должно совпадать. Есть идея сделать возможность такой записи:
Code
<?xml version="1.0" encoding="UTF-8"?>  
<Mod BaseFile="../base/Tweak.xml">  
       <Replace id="Jetpack.InitFuel">30000</Replace>
       <Replace id="Abduction.AverageHeight">0.5</Replace>  
       <Replace id="Bomber.Direction">
           <x>30</x>
       </Replace>  
       <Replace id="Bomber.Direction">
           <x>30</x>
       </Replace>  
       <Replace id="kWeaponSuperSheep">
          <MaxRollSpeed>0.1</MaxRollSpeed>
       </Replace>  
</Mod>

то есть тэг Replace будет сам определять тип заменяего контейнера и менять его содержимое. Если это будет сложный тип(как к примеру kWeaponSuperSheep), то он будет работать аналогично:

Code
<?xml version="1.0" encoding="UTF-8"?>  
<Mod BaseFile="../base/Tweak.xml">  
       <FlyingPayloadWeaponPropertiesContainer id="kWeaponSuperSheep" base="kWeaponSuperSheep" >
          <MaxRollSpeed>0.1</MaxRollSpeed>
       </FlyingPayloadWeaponPropertiesContainer>  
</Mod>


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
MarkWarT
Проверенные
Сообщений: 497
Реп: 22
Герыч, срочно нужна помощь. Проверь файл который я скину, я конвертил оружие из Havoc мода, это замена Огненного Кулака, но почему-то он все равно создает новый контейнер не заменяя старого! + вписывает неправильные координаты в LogicalPositionOffset и ImpulseDirection
Прикрепления: _12_rings-WeapT.xml (1.7 Kb)


Trading Unusual Nickname with Perfectly Straight Underlines, serious offers only

Сообщение отредактировал MarkWarT - СР, 13.01.2010, 17:18:51
 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
Опять то же правило действует.
Если ты хочешь сделать замену, то имена контейнеров должны совпадать.
ты пытаешься заменить MeleeWeaponPropertiesContainer на PayloadWeaponPropertiesContainer.

А ещё ты делаешь base='kWeaponFirePunch', но контейнеры MeleeWeaponPropertiesContainer и PayloadWeaponPropertiesContainer разные по типу, поэтому может получиться бред.
Внутри контейнеров тэг Vector не работает. Он может быть только в Mod!
<Vector id="LogicalPositionOffset">
<x>60</x>
<y>-8</y>
<z>60</z>
</Vector>
не работает.
Решение такой проблемы написать так:

Code

<?xml version="1.0" encoding="UTF-8"?>
<Mod BaseFile="../base/WeapTwk.xml">
     <Remove> kWeaponFirePunch </Remove>
     <PayloadWeaponPropertiesContainer id='kWeaponFirePunch'>
       ...
       <LogicalPositionOffset x='60' y='-8' z='60' />
       ...
     </PayloadWeaponPropertiesContainer>
</Mod>


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
MarkWarT
Проверенные
Сообщений: 497
Реп: 22
Ага, понятно. Спасибо!

Trading Unusual Nickname with Perfectly Straight Underlines, serious offers only
 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
В следующей версии скорее всего уберу атрибут BaseFile у тэга мод. Есть возможность передать это в качестве параметра xslt процессору.

________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
Форум » Моддинг » 6.1. Остальные уроки » Формат файла мода W4TweakGen (Описание с примерами)
  • Страница 1 из 1
  • 1
Поиск: